• poj 2453


    显然是位操作题

    做得有点没效率

    考虑三种情况:

    1. 从低位读起,第一个读到的1后是0(例*0010*,则处理后为*0100*)
    2. 从低位读起,读到一串1,分两种情况,a。最低位为1(例*0111,处理后为*1011);b。最低位为0(例*001110,处理后为*010011
    #include<stdio.h>
    #include<string.h>
    int main()
    {
    	int i,t;
    	long n,temp,bite[25],num[25]={0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304};
    	while(scanf("%ld",&n)!=EOF,n)
    	{
    		memset(bite,0,sizeof(bite));
    		for(i=1;i<25;i++)
    			bite[i]=n&num[i];
    		for(i=1;;i++)
    			if(bite[i])   //读到1
    			{
    				t=i-1;
    				if(bite[i+1])
    				{
    					for(i=i+1;;i++)  //2
    						if(!bite[i])
    						{
    							n=n&(~num[i-1]);
    							n=n|num[i];
    							break;
    						}
    					if(t)   //t>0,则情况2.b
    					{
    						temp=n;
    						temp=temp>>t;
    						temp=temp&(~(~0<<(i-2-t)));
    						n=n&(~0<<(i-2));
    						n=n+temp;
    					}
    				}
    				else if(!bite[i+1])   //情况1
    				{
    					n=n&(~num[i]);
    					n=n|num[i+1];
    				}
    				break;
    			}
    		printf("%ld\n",n);
    	}
    	return 0;
    }
    

    不过别人还有简短的代码:

    #include <stdio.h>
    int main()
    {
        int n,x;
        while(scanf("%d",&n),n)
        {
            x=n&-n;
            printf("%d\n",n+x+(n^n+x)/x/4);
        }
    }
    

  • 相关阅读:
    北大ACM 1008题—Maya Calendar
    C++ 输出彩色的控制台
    北大ACM 1003题—Hangover
    北大ACM 1009题—Edge Detection
    北大ACM 1004题—Financial Management
    北大ACM 1005题—I Think I Need a Houseboat
    Linux和win7双系统时间错误问题
    转化率极高的十个网站 怎样来提高转化率
    5次Shift粘滞键后门的应用
    单元测试基础知识
  • 原文地址:https://www.cnblogs.com/submarinex/p/1941278.html
Copyright © 2020-2023  润新知