当前位置:   article > 正文

考研C语言操作数以及函数刷题基础刷题

考研C语言操作数以及函数刷题基础刷题

目录

第一题 两数交换不用第三个参数(面试题)

 方法一:使用算数方法

方法二:异或

 第二题:将0000 0000 0000 0000 0000 0000 1010 改为 0000 0000 0000 0000 0000 0001 1010

第三题 判断闰年

 第四题:最大公约数

第五题:输出100-200之间的素数

 第六题:乘法口诀表

第七题: 完成对数组的操作

第八题:冒泡排序

第九题:统计二进制中1的个数

 方法一:%与/方法

注意 :负数的情况

方法二: 移位运算和位运算,循环32位

方法三: 只循环1的个数的次数(难)

第十题:获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列 

第十一题 :比较二进制位数不同个数


第一题 两数交换不用第三个参数(面试题

不用引用第三个参数,实现两个数交换。

 方法一:使用算数方法

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdlib.h>
  3. #include<stdio.h>
  4. //不用第三个参数实现两个数交换
  5. //方法一:算数方法
  6. int main()
  7. {
  8. int a = 5;
  9. int b = 3;
  10. a = a + b;
  11. b = a-b;
  12. a = a-b;
  13. printf("%d\n", a);
  14. printf("%d\n", b);
  15. return 0;
  16. }

方法二:异或

 ^异或操作符的意思是,相同为0,相异为1;所以可以实现交换。

    a = a ^ b;    //0011^0101=0110=6
    b = a ^ b;    //0110^0101=0011=3
    a = a ^ b;    //0110^0011=0101=5

  1. //方法二:逻辑异或
  2. int main()
  3. {
  4. int a = 3;
  5. int b = 5;
  6. a = a ^ b; //0011^0101=0110=6
  7. b = a ^ b; //0110^0101=0011=3
  8. a = a ^ b; //0110^0011=0101=5
  9. printf("%d\n", a);
  10. printf("%d\n", b);
  11. return 0;

 第二题:将0000 0000 0000 0000 0000 0000 1010 改为 0000 0000 0000 0000 0000 0001 1010

将0000 0000 0000 0000 0000 0000 1010 改为 0000 0000 0000 0000 0000 0001 1010

  1. //将10:0000 0000 0000 0000 0000 0000 1010 改为 0000 0000 0000 0000 0000 0001 1010
  2. int main()
  3. {
  4. int a = 10;
  5. //10 = 0000 0000 0000 0000 0000 0000 1010
  6. //或上 0000 0000 0000 0000 0000 0001 0000
  7. //0000 0000 0000 0000 0000 0001 0000 由0000 0000 0000 0000 0000 0000 0001左移四位获得
  8. a |= (1 << 4);
  9. printf("%d\n", a);
  10. return 0;
  11. }

 

 将26:0000 0000 0000 0000 0000 0001 1010 改为 0000 0000 0000 0000 0000 0000 1010

  1. //将26:0000 0000 0000 0000 0000 0001 1010 改为 0000 0000 0000 0000 0000 0000 1010
  2. int main()
  3. {
  4. int a = 26;
  5. //26 = 0000 0000 0000 0000 0000 0001 1010
  6. //与上 1111 1111 1111 1111 1111 1110 1111
  7. //1111 1111 1111 1111 1111 1110 1111由1111 1111 1111 1111 1111 1111 1111 1110向左移动4位
  8. //1111 1111 1111 1111 1111 1111 1111 1110可由 0000 0000 0000 0000 0000 0001取反获得
  9. a &= ~(1 << 4);
  10. printf("%d\n", a);
  11. return 0;
  12. }

第三题 判断闰年

 闰年:

1. 能被4整除,但不能被100整除

2.或者能被400整除的年叫闰年

3. 闰年必须是400的倍数,否则为平年

  1. //打印打印1000年到2000年之间的闰年
  2. int main()
  3. {
  4. int i = 1000;
  5. for (i = 1000; i <= 2000; i++)
  6. {
  7. if(i%4==0&&i%100!=0||i%400==0)
  8. {
  9. printf("%d ", i);
  10. }
  11. }
  12. return 0;
  13. }

判断是不是闰年

  1. int main()
  2. {
  3. /*int i = 1000;
  4. for (i = 1000; i <= 2000; i++)
  5. {
  6. if(i%4==0&&i%100!=0||i%400==0)
  7. {
  8. printf("%d ", i);
  9. }
  10. }*/
  11. int i = 0;
  12. scanf("%d", &i);
  13. if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
  14. {
  15. printf("是闰年\n");
  16. }
  17. else
  18. {
  19. printf("不是闰年\n");
  20. }
  21. return 0;
  22. }

 第四题:最大公约数

注意:

1. 两个scanf后面不要加空格或\n要不然编译器不知道什么时候为输入完。

2. 两个for循环是可以合并成一个的。 

  1. //最大公约数
  2. int main()
  3. {
  4. int n = 0;
  5. int m = 0;
  6. scanf("%d", &n);
  7. scanf("%d", &m);
  8. int i = 0;
  9. int sum = 0;
  10. for(i=1;i<n&&i<m;i++)
  11. {
  12. if(n%i==0&&m%i==0)
  13. {
  14. sum = i;
  15. }
  16. }
  17. printf("最大公约数为%d\n", i);
  18. return 0;
  19. }

第五题:输出100-200之间的素数

注意:

1.先遍历100-200

2.在遍历2——(n-1)

3.如果2——(n-1)之间存在不是素数的就break;

4.如果循环到最后,如果i=n-1,那么就是素数。

  1. //打印100-200素数
  2. int main()
  3. {
  4. int i = 0;
  5. int j = 0;
  6. for(i=100;i<200;i++)
  7. {
  8. for(j=2;j<i;j++)
  9. {
  10. if (i % j == 0)
  11. {
  12. break;
  13. }
  14. }
  15. if(i==j)
  16. {
  17. printf("%d ", i);
  18. }
  19. }
  20. return 0;
  21. }

 第六题:乘法口诀表

实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定

如:输入9,输出9*9口诀表,输出12,输出12*12的乘法口诀表。

  1. //在屏幕上输出9*9乘法口诀表
  2. void mul(int n)
  3. {
  4. for (int i = 1; i <= n; i++)
  5. {
  6. for (int j = 1; j <= i; j++)
  7. {
  8. printf("%d*%d=%d ", j, i, j * i);
  9. }
  10. printf("\n");
  11. }
  12. }
  13. int main()
  14. {
  15. int n = 0;
  16. scanf("%d", &n);
  17. mul(n);
  18. return 0;
  19. }

第七题: 完成对数组的操作

创建一个整形数组,完成对数组的操作

  1. 实现函数init() 初始化数组为全0
  2. 实现print()  打印数组的每个元素
  3. 实现reverse()  函数完成数组元素的逆置。

要求:自己设计以上函数的参数,返回值。

  1. //初始化为0
  2. void init(int arr[], int n)
  3. {
  4. for(int n=0;n<10;n++)
  5. {
  6. arr[n] = 0;
  7. }
  8. for(int j=0;j<10;j++)
  9. {
  10. printf("%d", arr[j]);
  11. }
  12. printf("\n");
  13. }
  14. //打印数组
  15. void print(int arr[], int n)
  16. {
  17. for (int j = 0; j < 10; j++)
  18. {
  19. printf("%d", arr[j]);
  20. }
  21. printf("\n");
  22. }
  23. //置逆数组
  24. void reverse(int arr[],int n)
  25. {
  26. int left = 0;
  27. int right = n - 1;
  28. int sum = 0;
  29. while(left<right)
  30. {
  31. sum = arr[right];
  32. arr[right] = arr[left];
  33. arr[left] = sum;
  34. left++;
  35. right--;
  36. }
  37. for (int j = 0; j < 10; j++)
  38. {
  39. printf("%d", arr[j]);
  40. }
  41. printf("\n");
  42. }
  43. int main()
  44. {
  45. int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
  46. /*init(arr, 10);*/
  47. //print(arr, 10);
  48. reverse(arr, 10);
  49. return 0;
  50. }

 

第八题:冒泡排序

 

  1. //冒泡排序
  2. void bubble(int arr[], int n)
  3. {
  4. int i = 0;
  5. int j = 0;
  6. int tmp = 0;
  7. for(i=0;i<n-1;i++)
  8. {
  9. for(j=0;j<n-1-i;j++)
  10. {
  11. if(arr[j] > arr[j+1])
  12. {
  13. tmp = arr[j ];
  14. arr[j] = arr[j+1];
  15. arr[j+1] = tmp;
  16. }
  17. }
  18. }
  19. }
  20. int main()
  21. {
  22. int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };
  23. bubble(arr, 10);
  24. for(int i=0;i<10;i++)
  25. {
  26. printf("%d ", arr[i]);
  27. }
  28. return 0;
  29. }

第九题:统计二进制中1的个数

 方法一:%与/方法

用%2,/2的方法。

例如15的二进制 0000.......0000 1111。四个1

注意 :负数的情况

如 -1:在计算机中是以补码的情况存储。 

-1的补码为:1111 1111 1111 1111 1111 1111 1111 1111 

-1%2=-1;-1模2余-1

-1/2=0;  -1除2,不够除,所以整数为0;所以会导致i不会++。结果为0;

 

所以我们需要用无符号整形 unsigned int,让-1的每一位都是有效位。 

  1. //统计二进制中1的个数
  2. void fun(unsigned int n)
  3. {
  4. int sum = 0;
  5. int i = 0;
  6. while(n)
  7. {
  8. sum = n % 2;
  9. n = n / 2;
  10. if (sum == 1)
  11. i++;
  12. }
  13. printf("%d", i);
  14. }
  15. int main()
  16. {
  17. int n = 0;
  18. scanf("%d", &n);
  19. fun(n);
  20. return 0;
  21. }

方法二: 移位运算和位运算,循环32位

  1. //方法二
  2. void fun(int n)
  3. {
  4. int count = 0;
  5. for(int i=0;i<32;i++)
  6. {
  7. if((n>>i)&1==1)
  8. {
  9. count++;
  10. }
  11. }
  12. printf("%d", count);
  13. }
  14. int main()
  15. {
  16. int n = 0;
  17. scanf("%d", &n);
  18. fun(n);
  19. return 0;
  20. }

 每一位都与1做与运算,双1为1。i从0开始,到32位结束。

因为,int是4字节,字节8位。计算机中都是以补码存储。

方法三: 只循环1的个数的次数(难)

用n&(n-1),这样在二进制可以每次都减少一个1,循环了几次就有几个1。

 

  1. //方法三
  2. void fun(int n)
  3. {
  4. int i = 0;
  5. while(n)
  6. {
  7. n = n & (n - 1);
  8. i++;
  9. }
  10. printf("%d", i);
  11. }
  12. int main()
  13. {
  14. int n = 0;
  15. scanf("%d", &n);
  16. fun(n);
  17. return 0;
  18. }

第十题:获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列 

 

  1. void fuc(int n)
  2. {
  3. for(int i=30;i>=0;i -=2)
  4. {
  5. printf("%d ", (n >> i) & 1);
  6. }
  7. printf("\n");
  8. for(int j=31;j>=0;j-=2)
  9. {
  10. printf("%d ", (n >> j) & 1);
  11. }
  12. }
  13. int main()
  14. {
  15. int n = 0;
  16. scanf("%d", &n);
  17. fuc(n);
  18. return 0;
  19. }

第十一题 :比较二进制位数不同个数

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

输入例子:

1999 2299

输出例子:7

 分别将这两个数的每一位取出来比较。

  1. //比较二进制位数
  2. void func(int n,int m)
  3. {
  4. int count = 0;
  5. for(int i=0;i<32;i++)
  6. {
  7. if (((n >> i) & 1) != ((m >> i) & 1))
  8. count++;
  9. }
  10. printf("%d", count);
  11. }
  12. int main()
  13. {
  14. int n = 0;
  15. int m = 0;
  16. scanf("%d %d", &n, &m);
  17. func(n, m);
  18. return 0;
  19. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/63783
推荐阅读
相关标签
  

闽ICP备14008679号