原题地址
http://ac.jobdu.com/problem.php?pid=1138
题意:将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
解题思路
由于这个10进制数的长度已经达到30位,属于大整数(超出20位的long long)的进制转换。
将输入的大整数存在int数组里,把这个数组当作一个整数,模拟小学时候学的整数除法,让这个大整数每次对2取余,最终的余数倒排就是结果,如图所示,52(10) = 110100(2)
需要注意的是,由于某位的商为0,所以可能存在多个前导0,每次要跳过这些前导0来求商。
AC代码
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
char str[35];
int num[35], res[100];
while (cin >> str)
{
int len = strlen(str), cnt = 0; //cnt为余数的个数
for (int i = 0; i < len; ++i)
num[i] = str[i] - '0';
while(1) //一直除直到商已经全为0
{
int i = 0;
while (i<len && num[i] == 0) ++i; //跳过前导0
if (i == len) break; //处理到全0的结尾
int mod = 0;
for (; i<len; ++i) //模拟除法
{
mod = 10*mod + num[i];
num[i] = mod/2;
mod = mod%2;
}
res[cnt++] = mod; //本次除法产生的余数
}
if (cnt == 0)
cout << 0 << endl;
else
{
for(int i = cnt-1; i >= 0; --i)
cout << res[i];
cout << endl;
}
}
return 0;
}