HUNAN UNIVERSITY ACM/ICPC Judge Online —— Problem 10038 Lowest Bit

这次注意到了几个问题:

1.数组的赋值问题。

数组的赋值只能逐个对数组元素赋值,不能直接对数组名赋值。例如,定义了int i,a[5]后,要将100,200,300,400,500存入数组a中,可用如下程序段实现:for (i=0;i<5;i++) a[i]=(i+1)*100; 或a[0]=100,a[1]=200,a[2]=300,a[3]=400,a[4]=500;但不能将该程序段写成:a={100,200,300,400,500};或a[5]={100,200,300,400,500};

所以我将一开始的Bin_Arr[32]={0,0,};(其实也是运行不通过的)改为了for(int z=0;z<30;z++)Bin_Arr[z]=0;

2.关于控制输入。

题目中要求用0作为输入的结束,一开始我在龟哥的建议下使用while(cin>>Num){.........}控制。但是发现输入值为0的时候直接从主程序就跳出来了。所以用

while(1)
{
cin>>Num;
if(Num==0)break;

................}

是比较好的。

3.关于问题描述。

之所以三次提交才AC不是因为我提交的时候程序有错误。而是问题描述出了问题。我以为要先输入,输入完毕以后集中打印结果。所以一开始还用了一个临时数组储存结果。结果老是RE,后来跑到“马牛不是人”那看了看,原来是这里出了问题。

问题描述:

Lowest Bit
Time Limit: 1000ms, Special Time Limit:2500ms, Memory Limit:32768KB
Total submit users: 415, Accepted users: 389
Problem 10038 : No special judgement
Problem description
Given an positive integer A (1 <= A <= 109), 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 <= 109). 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.


Sample Input
26
8
0

Sample Output
2
8

Problem Source
HNU 1'st Contest

郁闷,又是三次才AC!

// 315.cpp:Definestheentrypointfortheconsoleapplication.
//

#include
" stdafx.h "
#include
< iostream >
#include
< math.h >
using namespace std;

// #defineMAX_SIZE30;
int Bin_Arr[ 30 ] = ... {0,} ; // 全局二进制数组
int N = 0 ; // N记录二进制位数

void DecToBin( int Dec)
... {
if(Dec==1)
Bin_Arr[N]
=1;
else
...{
Bin_Arr[N]
=Dec%2;
Dec
=Dec/2;
N
++;
DecToBin(Dec);
}

}


int LowBit()
... {
for(intx=0;x<N+1;x++)
...{
if(Bin_Arr[x]==0)
1;
else
returnpow(2,x);
}

return0;
}


int main()
... {
intNum=0,temp=0;
inti=0;
while(1)
...{
cin
>>Num;
if(Num==0)break;
N
=0;
for(intz=0;z<30;z++)
Bin_Arr[z]
=0;
DecToBin(Num);
//for(intp=0;p<30;p++)
//cout<<Bin_Arr[p];
temp=LowBit();
cout
<<temp<<endl;
i
++;
}

return0;
}

同样附上“马牛不是人”的解法(每次他的代码都比我精简很多,诶~):

#include<stdio.h>
#include
<math.h>

intgetbits(int);
main()
{
intn;
scanf(
"%d",&n);
while(n!=0){
printf(
"%.0f ",pow(2,getbits(n)));
scanf(
"%d",&n);
}

return0;
}

intgetbits(intn)
{
if(n==1)return0;
inttmp=n,i=0,s[100];
for(i=0;i<100;i++)s[i]=-1;
i
=0;
while(1){
if((s[i++]=tmp%2)==1)returni-1;
tmp
=tmp/2;
}
}

更强的一个解!使用按位运算的解法。明天再贴上关于按位运算的学习心得。(现在这段代码完全看不懂……)

#include < iostream >

using namespace std;

int main()
... {
intN;
intres=1;
while(1)
...{
cin
>>N;
if(N==0)
break;
res
=1;
while((N&1)==0)
...{
res
*=2;
N
>>=1;
}

cout
<<res<<endl;
}


return0;
}

你可能感兴趣的:(online)