HUNAN UNIVERSITY ACM/ICPC Judge Online —— Problem 10038 Lowest Bit
2007-03-21 10:22
489 查看
这次注意到了几个问题:
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,后来跑到“马牛不是人”那看了看,原来是这里出了问题。
问题描述:
郁闷,又是三次才AC!
// 315.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
#include<math.h>
using namespace std;
//#define MAX_SIZE 30;
int Bin_Arr[30]=...{0,}; //全局二进制数组
int N=0; //N记录二进制位数
void DecToBin(int Dec)
...{
if(Dec==1)
Bin_Arr
=1;
else
...{
Bin_Arr
=Dec%2;
Dec=Dec/2;
N++;
DecToBin(Dec);
}
}
int LowBit()
...{
for(int x=0;x<N+1;x++)
...{
if(Bin_Arr[x]==0)
1;
else
return pow(2,x);
}
return 0;
}
int main()
...{
int Num=0,temp=0;
int i=0;
while(1)
...{
cin>>Num;
if(Num==0) break;
N=0;
for(int z=0;z<30;z++)
Bin_Arr[z]=0;
DecToBin(Num);
// for(int p=0;p<30;p++)
// cout<<Bin_Arr[p];
temp=LowBit();
cout<<temp<<endl;
i++;
}
return 0;
}
同样附上“马牛不是人”的解法(每次他的代码都比我精简很多,诶~):
更强的一个解!使用按位运算的解法。明天再贴上关于按位运算的学习心得。(现在这段代码完全看不懂……)
#include <iostream>
using namespace std;
int main()
...{
int N;
int res = 1;
while(1)
...{
cin >> N;
if(N == 0)
break;
res = 1;
while((N & 1) == 0)
...{
res *= 2;
N >>= 1;
}
cout << res << endl;
}
return 0;
}
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 |
// 315.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
#include<math.h>
using namespace std;
//#define MAX_SIZE 30;
int Bin_Arr[30]=...{0,}; //全局二进制数组
int N=0; //N记录二进制位数
void DecToBin(int Dec)
...{
if(Dec==1)
Bin_Arr
=1;
else
...{
Bin_Arr
=Dec%2;
Dec=Dec/2;
N++;
DecToBin(Dec);
}
}
int LowBit()
...{
for(int x=0;x<N+1;x++)
...{
if(Bin_Arr[x]==0)
1;
else
return pow(2,x);
}
return 0;
}
int main()
...{
int Num=0,temp=0;
int i=0;
while(1)
...{
cin>>Num;
if(Num==0) break;
N=0;
for(int z=0;z<30;z++)
Bin_Arr[z]=0;
DecToBin(Num);
// for(int p=0;p<30;p++)
// cout<<Bin_Arr[p];
temp=LowBit();
cout<<temp<<endl;
i++;
}
return 0;
}
同样附上“马牛不是人”的解法(每次他的代码都比我精简很多,诶~):
#include <stdio.h> #include <math.h> int getbits(int); main() { int n; scanf("%d",&n); while(n!=0){ printf("%.0f ",pow(2,getbits(n))); scanf("%d",&n); } return 0; } int getbits(int n) { if(n==1)return 0; int tmp=n,i=0,s[100]; for (i = 0;i<100;i++)s[i]=-1; i = 0; while(1){ if( (s[i++]=tmp%2) == 1)return i-1; tmp = tmp/2; } } |
更强的一个解!使用按位运算的解法。明天再贴上关于按位运算的学习心得。(现在这段代码完全看不懂……)
#include <iostream>
using namespace std;
int main()
...{
int N;
int res = 1;
while(1)
...{
cin >> N;
if(N == 0)
break;
res = 1;
while((N & 1) == 0)
...{
res *= 2;
N >>= 1;
}
cout << res << endl;
}
return 0;
}
相关文章推荐
- HUNAN UNIVERSITY ACM/ICPC Judge Online_Problem 10038_Lowest Bit
- HUNAN UNIVERSITY ACM/ICPC Judge Online_Problem 10013_Calendar
- HUNAN UNIVERSITY ACM/ICPC Judge Online_Problem 10001_Longest Ordered Subsequence
- HUNAN UNIVERSITY ACM/ICPC Judge Online_Problem 10054_导弹拦截
- HUNAN UNIVERSITY ACM/ICPC Judge Online_Problem 10042_SpinLock
- HUNAN UNIVERSITY ACM/ICPC Judge Online_Problem 10015_Self Numbers
- HUNAN UNIVERSITY ACM/ICPC Judge Online_Problem 10048_Common permutation
- HUNAN UNIVERSITY ACM/ICPC Judge Online_Problem 10026_谁拿了最多奖学金
- HUNAN UNIVERSITY ACM/ICPC Judge Online_Problem 10039_Magician
- HUNAN UNIVERSITY ACM/ICPC Judge Online —— Problem 10026 谁拿了最多奖学金
- HUNAN UNIVERSITY ACM/ICPC Judge Online —— Problem 10049 IP Address
- HUNAN UNIVERSITY ACM/ICPC Judge Online_Problem 10049_IP Address
- HUNAN UNIVERSITY ACM/ICPC Judge Online_Problem 10014_The Triangle
- HUNAN UNIVERSITY ACM/ICPC Judge Online_Problem 11146_Number Guessing
- HUNAN UNIVERSITY ACM/ICPC Judge Online_Problem 10010_Recaman's Sequence
- HUNAN UNIVERSITY ACM/ICPC Judge Online_Problem 11135_The ones to remain
- HUNAN UNIVERSITY ACM/ICPC Judge Online_Problem 10050_Jolly Jumpers
- HUST ACM/ICPC Online Judge Problem 1010--解题报告
- http://acm.pku.edu.cn/JudgeOnline/problem?id=2480 欧拉
- http://acm.pku.edu.cn/JudgeOnline/problem?id=2305 大数的b进制数 取模