首页 > 代码库 > ACM:每行输入一个正整数n,找出与它对应的比它大的最小的且它们对应的二进制中1的个数一样多的正整数.
ACM:每行输入一个正整数n,找出与它对应的比它大的最小的且它们对应的二进制中1的个数一样多的正整数.
#include<stdio.h> //每行输入一个正整数i,找出与他对应的比它大的最小的正整数且他们的二进制中1的个数一样多。 /* 样例输入: 样例输出: 1 2 2 4 3 5 4 8 78 83 0 */ //78的二进制位1001110,有4个1;83比78大且83的二进制位1001011也是4个1. int main() { int count1,count2;//count1统计原数据对应的二进制中1的个数,count2... int a[100];//存输入的数字 int i=0,len=0;//i是循环变量,len是数字个数 int n;//n时输入数字的变量 int A,B;//下面求余、相除、时需要用到的变量 int temp=0;//判断是0还是1 while(1)//循环输入多组数据直到输入的是0结束输入 { scanf("%d",&n); if(n==0)//输入0时结束输入,放在这里0的值就不会存到数组中了 break; a[i]=n; i++; len++; } for(i=0;i<len;i++)//循环比较a数组中的每一个数字 { A=a[i];//把a[i]的值赋给A,下面就用A来运算,a[i]的值就不会变了,以便下面求比它大的数字a[i]++ count1=0;//关键一步,计算每一个数组a中的数据时,都要把count1初始化为0,切记切记!!! while(A) { temp=A%2; A=A/2; if(temp==1)//二进制位是1时,计数器加1 { count1++; } } while(a[i]++)//a[i]依次做加1操作直到找出和a[i]对应的二进制数组1的个数相等的最小整数 { B=a[i]; count2=0;//关键一步,计算每一个a[i]++数据时,都要把count2初始化为0,切记切记!!! while(B)//此循环求出二进制中1的个数 { temp=B%2; B=B/2; if(temp==1)//二进制位是1时,计数器加1 { count2++; } } if(count1==count2)//二进制中1的个数相等就输出a[i]的值并跳出此循环。退到最外层的for循环 { printf("%d\n",a[i]); break; } } } return 0; }
ACM:每行输入一个正整数n,找出与它对应的比它大的最小的且它们对应的二进制中1的个数一样多的正整数.
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。