题目描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入描述:
多组数据,每行为一个长度不超过30位的十进制非负整数。 (注意是10进制数字的个数可能有30个,而非30bits的整数)
输出描述:
每行输出对应的二进制数。
示例1
输入
0 1 3 8
输出
0 1 11 1000
解题思路
这是一道关于大数整数的处理,对于长度为30的整数,我们采用字符串的形式进行存储。
首先我们回想一下,在将十进制数转化为二进制数的时候的做法,采用的是 “除2取余,逆序排列” 的做法:
那么很显然,我们需要一个数组来存放余数,或者可以使用一个栈实现逆序排列;
问题就转化成可如何求这个大数除2的余数。对于一个数来说,其对2的余数只取决于它的末位,即其末位对2的余数;
所以我们必须存储每一次 除以2的商,并且取其末位进行取余。
最后将余数逆序输出即可,另外需要注意的是,每一次处理的数都是字符型。
1 #include <iostream> 2 #include <string> 3 #include <cstring> 4 using namespace std; 5 6 int main() 7 { 8 char s[31]; 9 while(cin>>s) 10 { 11 int carry = 0; //进位位; 12 int index = 0; 13 int zero_num = 0; 14 char t[10000]; 15 int len = strlen(s); 16 17 while(1) 18 { 19 zero_num=0; 20 t[index++] = (s[len-1]-'0')%2 + '0'; 21 for(int i=0;i<len;i++) 22 { 23 carry = (s[i]-'0')%2; //按照10进制竖式除法,先从高位除起 24 s[i] = (s[i]-'0')/2 + '0'; //保存高位的商 即竖式除法上面的数字 25 s[i+1] = carry*10 + s[i+1]; 26 if(s[i]=='0') zero_num++; 27 } 28 if(zero_num == len) break; 29 } 30 for (int i=index-1;i>=0;i--) 31 { 32 cout << t[i]; 33 } 34 cout << endl; 35 } 36 }