找出只出现一次的数字在一个整型数组中只有一个数字出现一次其他数组都是成对出现的请找出那个只出现一次的数字。例如数组中有1 2 3 4 5 1 2 3 4只有5出现一次其他数字都出现2次找出5思路0 ^ n n 、n ^ n 0、通过异或算出最后的结果1^2^3^4^5^1^2^3^4相当于1^10、2^20、3^30、4^40、结果就为5#include stdio.h int f(int arr[], int len) { int ret 0; int i 0; for (i 0; i len; i) { ret ^ arr[i]; } return ret; } int main() { int arr[] { 1,2,3,4,5,1,2,3,4 }; int len sizeof(arr) / sizeof(arr[0]); int dog f(arr, len); printf(%d\n, dog); return 0; }交换两个变量不创建临时变量不允许创建临时变量交换两个整数的内容方法一思路通过异或交换#define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h //不允许创建临时变量交换两个整数的内容 int main() { int a 5; int b 1; //0101^0001 a a ^ b;//0100 4 //0100^0001 b a ^ b;//0101 5 //0100^0101 a a ^ b;//0001 1 return 0; }方法二思路通过加减法交换不推荐可能会整数溢出因为整数较大时ab可能会超出整数的范围#define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h //不允许创建临时变量交换两个整数的内容 int main() { int a 5; int b 1; a a b; b a - b; a a - b; return 0; }统计二进制中1的个数写一个函数返回参数二进制中 1 的个数比如 15 0000 1111 4 个 1二进制中1的个数_牛客题霸_牛客网方法一思路 循环进行以下操作直到n被缩减为01. 用该数据模2检测其是否能够被2整除2. 可以则该数据对应二进制比特位的最低位一定是0否则是1如果是1给计数加1 3. 如果n不等于0时继续1int NumberOf1(int n) { // 15 0000 1111 4 个 1 int count 0; unsigned int un (unsigned int)n; while (un ! 0) { if (un % 2 1) { count; } un un / 2; } return count; }方法二方法一效率低思路 一个int类型的数据对应的二进制一共有32个比特位可以采用位运算的方式一位一位的检测int NumberOf1(unsigned int n) { int count 0; int i 0; for(i0; i32; i) { if(((ni)1) 1) count; } return count; }方法三方法二效率也低因为每回都要循环32次思路用相邻的两个数据进行按位与运算int NumberOf1(int n) { int count 0; while(n) { n n(n-1); count; } return count; }打印整数二进制的奇数位和偶数位获取一个整数二进制序列中所有的偶数位和奇数位分别打印出二进制序列思路打印相应位数的数一个二进制通过右移再1#define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h //获取一个整数二进制序列中所有的偶数位和奇数位分别打印出二进制序列 void NumberOf1(int n) { printf(偶数位); for (int i 31; i 1; i - 2) { printf(%d, (n i) 1); } printf(\n); printf(奇数位); for (int i 30; i 0; i - 2) { printf(%d, (n i) 1); } } int main() { int n 0; scanf(%d, n); NumberOf1(n); return 0; }求两个数二进制中不同位的个数两个整数二进制位不同个数_牛客题霸_牛客网思路先用异或算出两个数找不同的结果的值再把这个值存入temp然后利用循环只要temp不是0的时候就执行循环体用temp (temp-1)把temp里面有多少个1算出来其中的逻辑是每一次少一个1这样就循环一次算出一个1把每次循环算出来的1存入count里#include stdio.h int main() { int a, b; while (scanf(%d %d, a, b) ! EOF) { // 注意 while 处理多个 case // 64 位输出请用 printf(%lld) to int count 0; int temp a ^ b; while(temp){ count; temp temp (temp - 1); } printf(%d\n, count); } return 0; }
进制练习题【找出只出现一次的数字、交换两个变量(不创建临时变量)、统计二进制中1的个数、打印整数二进制的奇数位和偶数位、求两个数二进制中不同位的个数】
发布时间:2026/7/5 13:28:32
找出只出现一次的数字在一个整型数组中只有一个数字出现一次其他数组都是成对出现的请找出那个只出现一次的数字。例如数组中有1 2 3 4 5 1 2 3 4只有5出现一次其他数字都出现2次找出5思路0 ^ n n 、n ^ n 0、通过异或算出最后的结果1^2^3^4^5^1^2^3^4相当于1^10、2^20、3^30、4^40、结果就为5#include stdio.h int f(int arr[], int len) { int ret 0; int i 0; for (i 0; i len; i) { ret ^ arr[i]; } return ret; } int main() { int arr[] { 1,2,3,4,5,1,2,3,4 }; int len sizeof(arr) / sizeof(arr[0]); int dog f(arr, len); printf(%d\n, dog); return 0; }交换两个变量不创建临时变量不允许创建临时变量交换两个整数的内容方法一思路通过异或交换#define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h //不允许创建临时变量交换两个整数的内容 int main() { int a 5; int b 1; //0101^0001 a a ^ b;//0100 4 //0100^0001 b a ^ b;//0101 5 //0100^0101 a a ^ b;//0001 1 return 0; }方法二思路通过加减法交换不推荐可能会整数溢出因为整数较大时ab可能会超出整数的范围#define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h //不允许创建临时变量交换两个整数的内容 int main() { int a 5; int b 1; a a b; b a - b; a a - b; return 0; }统计二进制中1的个数写一个函数返回参数二进制中 1 的个数比如 15 0000 1111 4 个 1二进制中1的个数_牛客题霸_牛客网方法一思路 循环进行以下操作直到n被缩减为01. 用该数据模2检测其是否能够被2整除2. 可以则该数据对应二进制比特位的最低位一定是0否则是1如果是1给计数加1 3. 如果n不等于0时继续1int NumberOf1(int n) { // 15 0000 1111 4 个 1 int count 0; unsigned int un (unsigned int)n; while (un ! 0) { if (un % 2 1) { count; } un un / 2; } return count; }方法二方法一效率低思路 一个int类型的数据对应的二进制一共有32个比特位可以采用位运算的方式一位一位的检测int NumberOf1(unsigned int n) { int count 0; int i 0; for(i0; i32; i) { if(((ni)1) 1) count; } return count; }方法三方法二效率也低因为每回都要循环32次思路用相邻的两个数据进行按位与运算int NumberOf1(int n) { int count 0; while(n) { n n(n-1); count; } return count; }打印整数二进制的奇数位和偶数位获取一个整数二进制序列中所有的偶数位和奇数位分别打印出二进制序列思路打印相应位数的数一个二进制通过右移再1#define _CRT_SECURE_NO_WARNINGS 1 #include stdio.h //获取一个整数二进制序列中所有的偶数位和奇数位分别打印出二进制序列 void NumberOf1(int n) { printf(偶数位); for (int i 31; i 1; i - 2) { printf(%d, (n i) 1); } printf(\n); printf(奇数位); for (int i 30; i 0; i - 2) { printf(%d, (n i) 1); } } int main() { int n 0; scanf(%d, n); NumberOf1(n); return 0; }求两个数二进制中不同位的个数两个整数二进制位不同个数_牛客题霸_牛客网思路先用异或算出两个数找不同的结果的值再把这个值存入temp然后利用循环只要temp不是0的时候就执行循环体用temp (temp-1)把temp里面有多少个1算出来其中的逻辑是每一次少一个1这样就循环一次算出一个1把每次循环算出来的1存入count里#include stdio.h int main() { int a, b; while (scanf(%d %d, a, b) ! EOF) { // 注意 while 处理多个 case // 64 位输出请用 printf(%lld) to int count 0; int temp a ^ b; while(temp){ count; temp temp (temp - 1); } printf(%d\n, count); } return 0; }