题目1138:进制转换
时间限制:1 秒
内存限制:32 兆
特殊判题:否
提交:4418
解决:1665
-
题目描述:
-
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
-
输入:
-
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
-
输出:
-
每行输出对应的二进制数。
-
样例输入:
-
0 1 3 8
-
样例输出:
-
0 1 11 1000
-
来源:
- 2008年北京大学软件所计算机研究生机试真题
- 第一次接触大数的题,没有思路,参看的别人的代码,不得不说,这位老兄写的确实不错。方法就是用代码来模拟正常的除二取余过程。位数太多,只能用字符串存储。那么字符串如何除以2呢?答案是按位依次除(就是相当于模拟列竖式做除法的过程,那样不就是从高位一点一点除嘛),每次把商(tmp)累积起来(sum),如果本次循环(竖式除法)还没有到最后一位(还没有除到个位),就把本步算得的对2的余数乘以10挤到下一位(str[i+1])上去,想象列竖式的过程;如果本次循环已经到了最后一位,那证明这次除法要做完了,那就把余数放到二进制的那个数组里去。然后,再把本位更新成一进来就算出来的商。至此,完成一次“除二取余”。我比大神们写的详细一点,便于像我一样的菜鸟理解^_^
- ************************
- 代码不长,要注意的就是别忘了该加‘0’的地方。
-
#include <iostream> #include <string.h> #include <cstring> char binvec[1001]; using namespace std; void dec2bin(string str) { int sum=1; int len=str.size(); int size=0,tmp; while(sum){ sum=0; for(int i=0;i<len;i++){ tmp=(str[i]-'0')/2; sum+=tmp; if(i==len-1){ binvec[size++]=str[i]%2+'0'; }else{ str[i+1]+=(str[i]-'0')%2*10; } str[i]=tmp+'0'; } } } void reverse_out() { for(int i=strlen(binvec)-1;i>=0;i--){ cout<<binvec[i]; } cout<<endl; } int main() { string str; while(cin>>str){ memset(binvec,0,sizeof(binvec)); dec2bin(str); reverse_out(); } return 0; }
**************************** - 坚持,而不是打鸡血~