//1223:An Easy Problem #include<iostream> #include<cstring> using namespace std; int n,n1,a[32],i,j,len,sum,add;//len记录数组长度,sum记录原数字换算成二进制中有多少个1,newsum计算原数字加1后二进制有多少个1 //add统计增加了几次1 void tobinary() //n转二进制,保存在a数组中 { memset(a,0,sizeof(a));//每次转换前,将内存清空 int i=0; while(n>0) //十进制转为二进制,并存在数组中 { a[i]=n%2; n/=2; i++; } len=i-1;//len为数组长度 return; } void addone()//二进制数加1 { int jinwei=1;//最低位加的1,可以看成是进位1 for(i=0;i<=len;i++) { a[i]+=jinwei; jinwei=a[i]/2; a[i]%=2; } if(jinwei==1)//二进制的长度增加1 { a[i]=1; len++; } add++; return; } int tongji()//统计二进制位中有多少个1 { int ans=0; for(int i=0;i<=len;i++) if(a[i]==1) ans++; return ans; } int main() { cin>>n; while(n!=0) { n1=n;//将n的值记录下来,因为在将n转为二进制时,n的值有变化 add=0;//增加1的次数清零 tobinary();//将n转为二进制,保存在数组中 sum=tongji();//统计n转换为二进制后有多少个1 addone();//先加1 while(true) { if(tongji()==sum)//判断加1后,二进制位中有多少个1,如果1的个数和原来的一样多,退出循环 break; addone();//如果不一样多,继续二进制加1 } cout<<n1+add<<endl; cin>>n;//接着输入下一个测试数据,直到输入的数字为0,退出 } return 0; }
时间: 2024-01-30 16:02:41 浏览: 140
这是一个计算二进制数中1的个数的 C++ 程序,输入一个十进制数 n,计算出 n 转换成二进制数之后1的个数 sum,然后不断将 n 加 1,直到 n 加 1 后二进制数中1的个数等于 sum,输出此时的 n 的值。
程序的实现方法是:先将 n 转换成二进制数,统计二进制数中1的个数,然后不断将 n 加 1,统计加 1 后二进制数中1的个数,直到加 1 后二进制数中1的个数等于原来的1的个数。每次加 1 后,记录增加1的次数,最终的结果是原数加上增加1的次数。
程序的主要代码如下:
```c++
void tobinary() {
memset(a, 0, sizeof(a));
int i = 0;
while (n > 0) {
a[i] = n % 2;
n /= 2;
i++;
}
len = i - 1;
return;
}
void addone() {
int jinwei = 1;
for (i = 0; i <= len; i++) {
a[i] += jinwei;
jinwei = a[i] / 2;
a[i] %= 2;
}
if (jinwei == 1) {
a[i] = 1;
len++;
}
add++;
return;
}
int tongji() {
int ans = 0;
for (int i = 0; i <= len; i++)
if (a[i] == 1) ans++;
return ans;
}
int main() {
cin >> n;
while (n != 0) {
n1 = n;
add = 0;
tobinary();
sum = tongji();
addone();
while (true) {
if (tongji() == sum)
break;
addone();
}
cout << n1 + add << endl;
cin >> n;
}
return 0;
}
```
程序的完整代码如下:
阅读全文