赞
踩
目录
第二题:将0000 0000 0000 0000 0000 0000 1010 改为 0000 0000 0000 0000 0000 0001 1010
第十题:获取一个整数二进制序列中所有的偶数位和奇数位,分别打印出二进制序列
不用引用第三个参数,实现两个数交换。
- #define _CRT_SECURE_NO_WARNINGS
- #include<stdlib.h>
- #include<stdio.h>
-
- //不用第三个参数实现两个数交换
-
- //方法一:算数方法
-
- int main()
- {
- int a = 5;
- int b = 3;
-
- a = a + b;
- b = a-b;
- a = a-b;
- printf("%d\n", a);
- printf("%d\n", b);
- return 0;
-
- }
^异或操作符的意思是,相同为0,相异为1;所以可以实现交换。
a = a ^ b; //0011^0101=0110=6
b = a ^ b; //0110^0101=0011=3
a = a ^ b; //0110^0011=0101=5
- //方法二:逻辑异或
- int main()
- {
- int a = 3;
- int b = 5;
- a = a ^ b; //0011^0101=0110=6
- b = a ^ b; //0110^0101=0011=3
- a = a ^ b; //0110^0011=0101=5
- printf("%d\n", a);
- printf("%d\n", b);
- return 0;
-
将0000 0000 0000 0000 0000 0000 1010 改为 0000 0000 0000 0000 0000 0001 1010
- //将10:0000 0000 0000 0000 0000 0000 1010 改为 0000 0000 0000 0000 0000 0001 1010
- int main()
- {
- int a = 10;
- //10 = 0000 0000 0000 0000 0000 0000 1010
- //或上 0000 0000 0000 0000 0000 0001 0000
- //0000 0000 0000 0000 0000 0001 0000 由0000 0000 0000 0000 0000 0000 0001左移四位获得
- a |= (1 << 4);
- printf("%d\n", a);
- return 0;
- }
将26:0000 0000 0000 0000 0000 0001 1010 改为 0000 0000 0000 0000 0000 0000 1010
- //将26:0000 0000 0000 0000 0000 0001 1010 改为 0000 0000 0000 0000 0000 0000 1010
-
- int main()
- {
- int a = 26;
- //26 = 0000 0000 0000 0000 0000 0001 1010
- //与上 1111 1111 1111 1111 1111 1110 1111
- //1111 1111 1111 1111 1111 1110 1111由1111 1111 1111 1111 1111 1111 1111 1110向左移动4位
- //1111 1111 1111 1111 1111 1111 1111 1110可由 0000 0000 0000 0000 0000 0001取反获得
- a &= ~(1 << 4);
- printf("%d\n", a);
- return 0;
- }
闰年:
1. 能被4整除,但不能被100整除
2.或者能被400整除的年叫闰年
3. 闰年必须是400的倍数,否则为平年
- //打印打印1000年到2000年之间的闰年
-
- int main()
- {
- int i = 1000;
- for (i = 1000; i <= 2000; i++)
- {
- if(i%4==0&&i%100!=0||i%400==0)
- {
- printf("%d ", i);
- }
- }
- return 0;
- }
判断是不是闰年
- int main()
- {
- /*int i = 1000;
- for (i = 1000; i <= 2000; i++)
- {
- if(i%4==0&&i%100!=0||i%400==0)
- {
- printf("%d ", i);
- }
- }*/
- int i = 0;
- scanf("%d", &i);
- if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)
- {
- printf("是闰年\n");
- }
- else
- {
- printf("不是闰年\n");
- }
-
- return 0;
- }
注意:
1. 两个scanf后面不要加空格或\n要不然编译器不知道什么时候为输入完。
2. 两个for循环是可以合并成一个的。
- //最大公约数
-
- int main()
- {
- int n = 0;
- int m = 0;
- scanf("%d", &n);
- scanf("%d", &m);
- int i = 0;
- int sum = 0;
- for(i=1;i<n&&i<m;i++)
- {
- if(n%i==0&&m%i==0)
- {
- sum = i;
- }
- }
- printf("最大公约数为%d\n", i);
- return 0;
- }
注意:
1.先遍历100-200
2.在遍历2——(n-1)
3.如果2——(n-1)之间存在不是素数的就break;
4.如果循环到最后,如果i=n-1,那么就是素数。
- //打印100-200素数
-
- int main()
- {
- int i = 0;
- int j = 0;
- for(i=100;i<200;i++)
- {
- for(j=2;j<i;j++)
- {
- if (i % j == 0)
- {
- break;
- }
- }
- if(i==j)
- {
- printf("%d ", i);
- }
-
- }
- return 0;
- }
实现一个函数,打印乘法口诀表,口诀表的行数和列数自己指定
如:输入9,输出9*9口诀表,输出12,输出12*12的乘法口诀表。
- //在屏幕上输出9*9乘法口诀表
- void mul(int n)
- {
- for (int i = 1; i <= n; i++)
- {
- for (int j = 1; j <= i; j++)
- {
- printf("%d*%d=%d ", j, i, j * i);
- }
- printf("\n");
- }
- }
- int main()
- {
- int n = 0;
- scanf("%d", &n);
- mul(n);
- return 0;
- }
创建一个整形数组,完成对数组的操作
- 实现函数init() 初始化数组为全0
- 实现print() 打印数组的每个元素
- 实现reverse() 函数完成数组元素的逆置。
要求:自己设计以上函数的参数,返回值。
- //初始化为0
- void init(int arr[], int n)
- {
- for(int n=0;n<10;n++)
- {
- arr[n] = 0;
- }
- for(int j=0;j<10;j++)
- {
- printf("%d", arr[j]);
-
- }
- printf("\n");
- }
- //打印数组
- void print(int arr[], int n)
- {
- for (int j = 0; j < 10; j++)
- {
- printf("%d", arr[j]);
- }
- printf("\n");
-
- }
- //置逆数组
- void reverse(int arr[],int n)
- {
- int left = 0;
- int right = n - 1;
- int sum = 0;
- while(left<right)
- {
- sum = arr[right];
- arr[right] = arr[left];
- arr[left] = sum;
- left++;
- right--;
- }
- for (int j = 0; j < 10; j++)
- {
- printf("%d", arr[j]);
- }
- printf("\n");
-
- }
- int main()
- {
- int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };
- /*init(arr, 10);*/
- //print(arr, 10);
- reverse(arr, 10);
- return 0;
- }
- //冒泡排序
- void bubble(int arr[], int n)
- {
- int i = 0;
- int j = 0;
- int tmp = 0;
- for(i=0;i<n-1;i++)
- {
- for(j=0;j<n-1-i;j++)
- {
- if(arr[j] > arr[j+1])
- {
- tmp = arr[j ];
- arr[j] = arr[j+1];
- arr[j+1] = tmp;
- }
- }
- }
-
- }
- int main()
- {
- int arr[10] = { 10,9,8,7,6,5,4,3,2,1 };
- bubble(arr, 10);
- for(int i=0;i<10;i++)
- {
- printf("%d ", arr[i]);
- }
- return 0;
- }
用%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的个数
-
- void fun(unsigned int n)
- {
- int sum = 0;
- int i = 0;
- while(n)
- {
- sum = n % 2;
- n = n / 2;
- if (sum == 1)
- i++;
- }
- printf("%d", i);
- }
- int main()
- {
- int n = 0;
- scanf("%d", &n);
- fun(n);
- return 0;
- }
- //方法二
- void fun(int n)
- {
- int count = 0;
- for(int i=0;i<32;i++)
- {
- if((n>>i)&1==1)
- {
- count++;
- }
- }
- printf("%d", count);
- }
- int main()
- {
- int n = 0;
- scanf("%d", &n);
- fun(n);
- return 0;
- }
每一位都与1做与运算,双1为1。i从0开始,到32位结束。
因为,int是4字节,字节8位。计算机中都是以补码存储。
用n&(n-1),这样在二进制可以每次都减少一个1,循环了几次就有几个1。
- //方法三
-
- void fun(int n)
- {
- int i = 0;
- while(n)
- {
- n = n & (n - 1);
- i++;
- }
- printf("%d", i);
- }
- int main()
- {
- int n = 0;
- scanf("%d", &n);
- fun(n);
- return 0;
- }
- void fuc(int n)
- {
- for(int i=30;i>=0;i -=2)
- {
- printf("%d ", (n >> i) & 1);
- }
- printf("\n");
- for(int j=31;j>=0;j-=2)
- {
- printf("%d ", (n >> j) & 1);
- }
-
- }
- int main()
- {
- int n = 0;
- scanf("%d", &n);
- fuc(n);
- return 0;
- }
编程实现:两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
输入例子:
1999 2299
输出例子:7
分别将这两个数的每一位取出来比较。
- //比较二进制位数
- void func(int n,int m)
- {
- int count = 0;
- for(int i=0;i<32;i++)
- {
- if (((n >> i) & 1) != ((m >> i) & 1))
- count++;
- }
- printf("%d", count);
- }
- int main()
- {
- int n = 0;
- int m = 0;
- scanf("%d %d", &n, &m);
- func(n, m);
- return 0;
- }
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。