问题 C: 进制转换
时间限制: 1 Sec 内存限制: 32 MB
提交: 852 解决: 334
题目描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
输出
每行输出对应的二进制数。
样例输入
985
211
1126
样例输出
1111011001
11010011
10001100110
来自 <http://codeup.cn/problem.php?cid=100000579&pid=2>
解题思路:本题是一个大数转换二进制的问题,由题意显然超long long,所以采用数组的方式进行。二进制转换思路是将数字进行模2然后保存,这里处理的时最后一个数字,关键是数字太大没法直接进行/2操作,这时就得手工模拟/2操作了,显然我们需要对/2后的结果进行更新,什么意思?就是要将原来的存放原数的数字替换成现在/2所得的数字,这个数字为0时就是已经/2已经完成了,我们采用的时计算这些数字的和来进行判断数字是否全为0。还有一个点就是/2的时候有时除不尽呀,这个时候就需要进位了,怎么办呢,就是直接在后一位数加上前一位数%2*10就能完成这个操作了。这里提供一个博主的图:
原博主地址:https://blog.csdn.net/wzy_1988/article/details/8640266
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 10005;
int main()
{
string str;
int num[MAXN];
int ans[MAXN];
while(cin >> str)
{
int k = 0;
int sum = 1;
memset(num, 0, sizeof(num));
memset(ans, 0, sizeof(ans));
for(int i=0; i<str.size(); i++)
{
num[i] = str[i] - '0';
}
while(sum) //当商全为0时就结束
{
sum = 0;
for(int i=0; i<str.size(); i++)
{
int d = num[i] / 2; //计算每一位/2的结果作为数的更新
sum += d;
if(i == str.size()-1)
{
ans[k++] = num[i] % 2; //最后一位数进行%2操作
}
else
{
num[i+1] += num[i] % 2 * 10; //除不尽时的进位操作
}
num[i] = d; //更新数
}
}
for(int i=k-1; i>=0; i--)
{
cout << ans[i];
}
cout << endl;
}
return 0;
}