权重 相等大于N的最小数

来源:互联网 发布:php动态网页设计代码 编辑:程序博客网 时间:2024/05/16 09:54
题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=412
我的思路就是分情况:主要分为:11110000,  1101100, 11111111三种情况。第一种直接倒置前面加个一即可,第二种考虑01,颠倒下,并把后面的高位的1与地位的0交换:


代码如下:

#include<stdio.h>#include<string.h>#include<math.h>int main(){    int n,i,m,j,t;    char sa[32];    char cd[32];    while(scanf("%d",&n)!=EOF)    {        m=n;        int flag=0;        for(i=0;i<=31;i++)         {             if(n<0) sa[i]='1';             else sa[i]='0';             n=n<<1;         } //puts(sa);         for(i=0;i<=31;i++)          if(sa[i]!='0')break;          int a0=0,k,h;          for(j=0;i<=31;j++)          {                cd[j]=sa[i];i++;                if(sa[i]=='0') a0=1;          }         cd[j]='\0';          t=strlen(cd);          if(a0==0)          {              printf("%d\n",m+(int)pow(2,t-1));          }          else{            for(i=t-1;i>0;i--)              if(cd[i]=='1'&&cd[i-1]=='0')              {   flag=1;                  k=i;                  m=m+pow(2,t-1-i);                  h=t-1;                  for(int j=k+1;j<h;j++)                    { if(cd[j]=='1'&&cd[h]=='0')                       { m=m-pow(2,t-1-j)+pow(2,t-1-h);h=h-1;}  //此处为第二种情况;                      else break;                    }                   printf("%d\n",m);break;               }              long sum=0;              if(flag==0)              {                  for(i=0;i<t;i++)                    if(cd[i]=='1'&&cd[i+1]!='0')                       sum+=pow(2,i);                      sum=sum+pow(2,t);                      printf("%ld\n",sum);              }          }    }    return 0;}
还个简单的代码,不是我的:

 #include<stdio.h>int main(){   long x,b,t,c,m,r;   while(scanf("%d",&x)!=EOF)   {       b=x&(-x);  t=x+b;  c=t^x;  m=(c>>2)/b;  r=t|m;   printf("%d\n",r);     }    }         

还有个代码,不是很懂:

 #include<iostream>#include<cstdio>using namespace std;int main(){  int n,i,n0,cnt1,cnt2,k,l,N;  while(scanf("%d",&n)!=EOF)  {   cnt1=0;   N=n;   while(n)   {   if(n%2!=0)   break;      cnt1++;   n/=2;   }   cnt2=cnt1;   while(n)   {   if(n%2==0)   break;       cnt2++;   n/=2;   }   k=l=1;   for(i=1; i<=cnt1; i++)   k*=2;     k-=1;   for(i=1; i<=cnt2-cnt1-1; i++)   l*=2;      n0=k+l;   printf("%d\n",n0+N);  }  return 0;}        




原创粉丝点击