Lowest Bit

来源:互联网 发布:js object to list 编辑:程序博客网 时间:2024/06/07 05:51

Problem Description

Given an positive integer A (1 <= A <= 100), output the lowest bit of A.

For example, given A = 26, we can write A in binary form as 11010, so the lowest bit of A is 10, so the output should be 2.
 
Another example goes like this: given A = 88, we can write A in binary form as 1011000, so the lowest bit of A is 1000, so the output should be 8.

Input

Each line of input contains only an integer A (1 <= A <= 100). A line containing "0" indicates the end of input, and this line is not a part of the input data.

Output

For each A in the input, output a line containing only its lowest bit.

Example Input

26880

Example Output

28
个人想法:
我理解下的最低位即0 0 0... 后出现1时,则最低位为1000,则为8。 因此我可以计下0出现的次数n,0 0 0则计数为3,并使用pow函数,求出2的n次方数即得答案。但在多次提交后出现“超时”现象。
超时现象代码如下:
#include<stdio.h> #include<math.h>  int main(){     int A,num;     while(scanf("%d",&A)!=EOF){         int i=0;          while(A%2==0){         i++;         A=A/2;         }         num=pow(2,i);         printf("%d",num);     }     return 0; } 
再次调试后,出现“答案错误”现象。
答案错误现象代码如下:
#include<stdio.h> #include<math.h>  int main(){     int A,num;     scanf("%d\n",&A);    while(A){         int i=0;          while(A%2==0){         i++;         A=A/2;         }         num=pow(2,i);         printf("%d",num);         scanf("%d\n",&A);    }     return 0; } 
后请求学霸求助后,求得学霸思路:
分类讨论1.当输入的A%2!=0时,即A为奇数,知此时的二进制转换数为1,最低位也为1;
A为偶数时,1.该偶数%2==0,但某时刻(A/2)%2时出现!=0的情况时,即可知该数的最低位为2;
   2.该偶数%2==0,而且在某时刻依然(A/2)%2==0,则可利用个人想法中的
while(A%2==0){A = A/2;i++;}num = pow(2,i);printf("%d\n",num); 代码。
学霸思路代码:
#include<stdio.h>#include<math.h> int main(){int A;long long num;scanf("%d",&A);while(A){int i=0; if(A%2){printf("1\n");}else{if((A/2)%2){printf("2\n");}else{int i = 0;while(A%2==0){A = A/2;i++;}num = pow(2,i);printf("%d\n",num);}}scanf("%d",&A);}return 0;}
若出现时间超时现象,可写成while(scanf("%d",&A!=EOF),A){
}#include<iostream>using namespace std;int main(){    int num,sum,i,j,temp;    while(cin>>num && num!=0)    {       sum=1;temp=0;       for(i=1;temp==0;i++)       {           temp=num%2;           //arr[i]=num%2;           num=num/2;       }       //cout<<"i="<<i<<endl;       //for(;;i--)           //if(arr[i]==1)               //break;       for(j=1;j<i-1;j++)           sum=sum*2;       cout<<sum<<endl;    }    return 0;}
大神见此代码时,求 如何解决个人想法中出现超时或者答案错误的情况?