zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    

  • 相关阅读:
    登入界面的创建
    什么是IO流 以及文件输入输出
    java 的面向对象
    Mac 终端命令大全
    jQuery 的属性
    商城管理系统
    Java IO学习第二天部分详解
    Java IO学习第一天部分详解
    用JAVA描述一个车与修车厂两个事物
    JAVA基础(数组)数组排序和查找数组中是否还有某一个数
  • 原文地址:https://www.cnblogs.com/submarinex/p/1941278.html
Copyright © 2011-2022 走看看