An Easy Problem - 星熠OJ (xingyi.ac.cn)
描述
给定一个正整数N,求最小的、比N大的正整数M,使得M与N的二进制表示中有相同数目的1。
举个例子,假如给定的N为78,其二进制表示为1001110,包含4个1,那么最小的比N大的并且二进制表示中只包含4个1的数是83,其二进制是1010011,因此83就是答案。
输入描述
输入若干行,每行一个数n(1≤n≤1000000),输入"0"结束。
输出描述
输出若干行对应的值。
样例输入 1
1 2 3 4 78 0
样例输出 1
2 4 5 8 83
AC://写的代码有点乱,请原谅
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n;
while(cin>>n){
int t=n,sum=0,oum=0,a[100000];
if(n==0){
return 0;
}while(1){
a[sum]=t%2;
t/=2;
if(t==0){
break;
}
sum++;
}for(int i=0;i<sum;i++){
if(a[i]==1){
oum++;
}
}int yuyu=1;
while(1){
int yu=n+yuyu,klkl=0,b[100000],ko=yu,jsk=0;
while(1){
b[jsk]=ko%2;
ko/=2;
if(ko==0){
break;
}
jsk++;
}for(int i=0;i<jsk;i++){
if(b[i]==1){
klkl++;
}
}if(klkl==oum){
cout<<yu<<endl;
break;
}yuyu++;
}
}
}