将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入描述:
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
输出描述:
每行输出对应的二进制数。
只是十进制转二进制的话,并没有难度。就是依次去%2,直到被除数为0,将得到的余数倒叙保存下来就可以了。
现在的问题是30位已经超出了long long的范围,只能用字符串来表示。input表示输入的字符串,模拟除法运算的过程,从第一位开始除以2,得到的商记录在上面,余数落下来,与后一位组合做下一步的除以2运算。到最后一位时,就可以保存%2的结果为余数;重复这个过程直到被除数为0,也就是转化为二进制的过程结束。
#include<cstdio> #include<iostream> #include<vector> #include<algorithm> #include<string> #include<cctype> #include<cmath> using namespace std; int main() { string input; string result; while (cin>>input) { int lenin = input.length(); result = ""; int k = 0; int beichushuZero = 1; while (beichushuZero) { beichushuZero = 0; for (int i = 0; i < lenin; i++) { int temp = (input[i] - '0') / 2; //这一步写上去的商 if (temp)beichushuZero = 1;//为0的时候就是被除数为0,二进制到底了 if (i == lenin - 1) { result += (input[i] - '0') % 2 + '0'; } else { //这就是落下来之后与下一位结合进一步做除以2的运算 input[i + 1] = ((input[i] - '0') % 2) * 10 + input[i + 1]; } input[i] = temp + '0';//一次循环完后input会变成上一步得到的商 } } int lenr = result.length(); string ans = "";//逆置余数顺序 for (int i = lenr-1; i >=0; i--) { ans += result[i]; } cout << ans << endl; } }
文章来源: 【牛客网】进制转化(大整数)