题意:给定一个正整数,求最小的,比N大的正整数M,使得M与N的二进制中有相同数目的1,。
解法1:
#include<iostream>
using namespace std;
int main(){
int m,n,i,j,p,q;
int a[101],b[101];
cin>>m;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
i=1;
while(m){
a[i]=m%2;
m/=2;
i++;
}
n=i-1;
i=1;j=1;
while(a[i]!=1) i++;
//a[i]必定等于1
if(i==n){
cout<<"*****"<<endl;
n++;
a[i]=0;
a[i+1]=1;
}else{
cout<<"---"<<endl;
j=i;
while(a[j]!=0) j++;//a[j]=0;
a[j]=1;
//p=j-2;
//q=1;
for(p=i;p<j;p++)
if(p!=n)
a[p]=0;
for(q=1;q<j-i;q++)
a[q]=1;
}
/*
if(a[i]==0){
if(n==i) n++;
a[i]=1;
a[i+1]=0;
}else if(a[i]==1){
j=i+1;
while(a[j]==1) j++;
if(j==n){
n++;
a[j]=1;
}
for(j=n;j)
}
*/
for(i=n;i>0;i--){
cout<<a[i];
}
return 0;
}
解法2:
#include<iostream>
using namespace std;
int main(){
int m,n,t=0;
int a[1001];
cin>>m;
while(m){
a[t]=m%2;
m/=2;
t++;
}
n=t;
for(t=n-1;t>=0;t--){
cout<<a[t];
}
cout<<endl;
//for(i=n-1;i>=0;i--){
// if(a[i]==0){
// while()
//}else if(a[i]==1){
//}
//}
int i=0,j=0;
//最开始的一位是1,不可能是0,而最后一位是a[0],不是a[n-1]
if(a[i]==0){
while(a[i]==0) i++;
}
if(a[j]==1)
while(a[j]==1) j++;
if(i!=0){
//说明最后几位是0
cout<<"最后一位是0"<<endl;
int step1=i;
if(step1==n-1)
{
n++;
//如果首位只有一个1的话,这种解决办法是错的
a[n-1]=1;
a[i]=0;
}else
{
while(a[step1]==1&&step1<n) step1++;
}
if(step1==n){
for(int g=0;g<n-1;g++){
a[g]=0;
}
for(g=0;g<step1-i-1;g++){
a[g]=1;
}
//for()
}else{
int temp=a[step1];
a[step1]=a[step1-1];
a[step1-1]=temp;
for(int p=i;p<step1;p++){
a[p]=0;
}
for(p=0;p<step1-i-1;p++){
a[p]=1;
cout<<"a[i]= "<<1<<endl;
}
}
}
if(j!=0){
cout<<"最后一位是1"<<endl;
if(j==n){
n++;
for(int p=n;p>0;p--){
a[p]=1;
}
a[p]=0;
}else{
a[j]=1;
a[j-1]=0;
}
}
for(i=n-1;i>=0;i--){
cout<<a[i];
}
cout<<endl;
return 0;
}