【刷题笔记】Day1:操作符的使用和算术转换(下)

简介: 【刷题笔记】Day1:操作符的使用和算术转换(下)

4.两个int(32位)整数m和n的二进制表达中,有多少个bit位不同?


编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?

输入例子:

1999 2299

输出例子:7


方法1:m和n两者分别&1得到其二进制位最低位进行比较

int main()
{
  int m = 0;
  int n = 0;
  int i = 0;
  scanf("%d %d", &m, &n);
  int count = 0;
  for (i = 0; i < 32; i++)
  {
    if (((m >> i)&1)!= ((n >> i)&1))//这里不能把&1省略了
    {
      count++;
    }
  } 
  printf("%d\n", count);
  return 0;
}


把&1是否省略的区别在于:

  • 移位之后&1得到的是二进制序列里面的最低位,若没有&1,比较的时候是两个数字本身
  • 相对的是有&1,是在比最低位,无,是比较所有位对应的数字


图解:

67b4769b25204f53a5a7169382456133.jpg

像这样无论怎么移都count都不会++的,因为它们不是全部bit位对应相等


方法2:异或之后使用:n=n&(n-1)

#include<stdio.h>
int main()
{
  int m = 0;
  int n = 0;
  int i = 0;
  scanf("%d %d", &m, &n);
  int count = 0;
  //异或 - 相同为0,相异为1
  //010
  //001
  //011
  int ret = m ^ n;//m和n不同的bit位会得到结果二进制的1
  while (ret)//这里是为了得到1所消失的次数,1消失了几次,就说明有几个1,而1又是区分不同bit位的标志
  {
    ret = ret & (ret - 1);
    count++;
  }
  printf("%d\n", count);
  return 0;
}


594db0a500de4c3c8a6adcfb0668ca13.png

思想:如何判断一个数是不是 2 的幂次方?

🚀🚀🚀

2 的幂次方 的数:二进制中只有1个1

2 - 10

4 - 100

8 - 1000

...

n&(n-1) == 0

当&的结果为0,可以证明这个数就是2^n数

反例:

3

👇

0011

0010--结果为0010,不是2^n数


算术转换


1.编译器导致结果差异

下面代码的结果是:10 or 12?

#include <stdio.h>
int main()
{
    int i = 1;
    int ret = (++i)+(++i)+(++i);
    printf("ret = %d\n", ret);
  return 0;
}


答:程序错误

原因:在vs环境底下是12,在gcc环境底下是10


2.sizeof的返回值类型

下面代码的结果是:

#include <stdio.h>
int i;
int main()
{
    i--;
    if (i > sizeof(i))
    {
        printf(">\n");
    }
    else
    {
        printf("<\n");
    }
    return 0; 
}


1d670350a9334a1fba5effa3825590e9.png


3.有序数列的合并

注意:是有序数组

1469dbb71acb45a28b2778f011a8ed54.png

e5258802dacb4e2f8e758ca090739c4a.png

#include<stdio.h>
int main() {
    int n = 0;
    int m = 0;
    scanf("%d %d", &n, &m);
    int arr1[n];
    int arr2[m];
    int arr3[n + m];
    int i = 0;
    for (i = 0; i < n; i++) {
        scanf("%d", &arr1[i]);
    }
    for (i = 0; i < m; i++) {
        scanf("%d", &arr2[i]);
    }
    i = 0;
    int j = 0; //遍历arr2数组
    int k = 0; //放到第三个数组中去
    while (i < n && j < m) {
        if (arr1[i] < arr2[j]) {
            arr3[k] = arr1[i];
            i++;
            k++;
        } else {
            arr3[k] = arr2[j];
            j++;
            k++;
        }
    }
    if (i == n) {
        for (; j < m; j++) {
            arr3[k] = arr2[j];
            k++;
        }
    }
    if (j == m) {
        for (; i < n; i++) {
            arr3[k] = arr1[i];
            k++;
        }
    }
    for (k = 0; k < n + m; k++) {
        printf("%d ", arr3[k]);
    }
}

图解:

a0eb467b3bf14601962b2d0a04d8a2f3.png

执行:

3e458d7be7de45a1aa3f31422b03a801.png


4.小乐乐走台阶

#include<stdio.h>
int Upstairs(int n)
{
    if (n == 1)
        return  1;
    else if (n == 2)
        return   2;
    else
        return Upstairs(n - 1) + Upstairs(n - 2);
}
int main()
{
    int n;
    scanf("%d", &n);
    int ret=Upstairs(n);
    printf("%d", ret);
    return 0;
}


2cc49cd9de6b4cabb2da420e22f552a3.png

 跟青蛙跳台阶类似 

fc4a85c776364de080b40f613fb8f70c.png


5.变种水仙花

f6f249bc5efc4d34827a2e46b2d4568d.png

#include <stdio.h>
#include<math.h>
int main() {
    int i = 0;
    int n = 0;
    //sum定义的时候不能放在循环最外层循环外面,因为每次再回到j循环那sum没有得到重置,导致程序错误
    for (i = 10000; i < 99999; i++)
    {
        int j = 0;
        int sum = 0;
        for (j = 1; j <= 4; j++) {
            n = (int)pow(10, j);//pow函数返回的是double类型,所以需要强制转换成int
            sum = sum + (i / n) * (i % n);
        }
        if (sum == i)
        {
            printf("%d ", sum);
        }
    }
}

0775bee142c441c49933db495d476da1.png

6.三角形的判断

#include <stdio.h>
int main() {
    int a = 0;
    int b = 0;
    int c = 0;
    while (scanf("%d %d %d", &a, &b, &c) == 3) {
        if (a + b > c && a + c > b && b + c > a)//这里先把判断三角形的条件写在最外层循环,那么在内层循环就不用都添加这个条件了
          {
            if (a == b && a == c && b == c)//等边
           {
                printf("Equilateral triangle!\n");
           }
           else if ((a == b && a != c) || (a == c && a != b) || (b == c && b != a))//等腰 
            {
                printf("Isosceles triangle!\n");
            }
            else//普通三角形
            {
                printf("Ordinary triangle!\n");
            }
        }
        else {
            printf("Not a triangle!\n");
        }
    }
    return 0;
}


a5b2a8e9e75540ef886a43f628ecffaa.png

相关文章
|
C语言
C语言小trouble
C语言小trouble
89 0
|
存储 编译器 C语言
|
人工智能 大数据 云计算
|
存储 API 分布式数据库
Hbase客户端API基础小结笔记(未完)
客户端API:基础   HBase的主要客户端接口是由org.apache.hadoop.hbase.client包中的HTable类提供的,通过这个类,用户可以完成向HBase存储和检索数据,以及删除无效数据之类的操作。
1019 0
|
机器学习/深度学习 编解码 算法
【算法基础】归并排序解析
归并排序是建立在归并操作上的一种有效,稳定的排序算法,它是采用分治法的一个非常典型的应用。将待排序数组分为两条线逐级拆分,将子序列进行排序,然后沿两条线逐级合并,得到完全有序序列。这种通过递归,层层合并的方法,称为归并。
185 0
|
3天前
|
人工智能 自然语言处理 Shell
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
仅用3分钟,百炼调用满血版Deepseek-r1 API,享受百万免费Token。阿里云提供零门槛、快速部署的解决方案,支持云控制台和Cloud Shell两种方式,操作简便。Deepseek-r1满血版在推理能力上表现出色,尤其擅长数学、代码和自然语言处理任务,使用过程中无卡顿,体验丝滑。结合Chatbox工具,用户可轻松掌控模型,提升工作效率。阿里云大模型服务平台百炼不仅速度快,还确保数据安全,值得信赖。
157353 24
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
|
5天前
|
人工智能 API 网络安全
用DeepSeek,就在阿里云!四种方式助您快速使用 DeepSeek-R1 满血版!更有内部实战指导!
DeepSeek自发布以来,凭借卓越的技术性能和开源策略迅速吸引了全球关注。DeepSeek-R1作为系列中的佼佼者,在多个基准测试中超越现有顶尖模型,展现了强大的推理能力。然而,由于其爆火及受到黑客攻击,官网使用受限,影响用户体验。为解决这一问题,阿里云提供了多种解决方案。
16981 37
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。

热门文章

最新文章