算法笔记3.5C:数制转换
程序员文章站
2024-03-18 17:58:10
...
题目描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
输出
每行输出对应的二进制数。
样例输入
985
211
1126
样例输出
1111011001
11010011
10001100110
代码
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
char num1[30];
int num2[30];
while(scanf("%s", num1) != EOF){
int len = strlen(num1);
for(int i = 0; i < len; i++){
num2[i] = num1[i] - '0';
}
if(len == 1 && num2[0] == 0){
printf("0"); //数为零的情况
}
int ans[100], num = 0,turn = 0;
do{
turn = 0; //判断数为否为零
for(int i = 0; i < len; i++){
if(num2[i] != 0){
turn = 1;
break;
}
}
if(turn == 0) //数为零直接跳出循环
break;
ans[num++] = num2[len - 1] % 2; //进制转换,一个数的余2操作等同于对末位数做余2
for(int j = 0; j < len - 1; j++){
num2[j+1] = num2[j] % 2 * 10 + num2[j+1];
num2[j] = num2[j] / 2;
}
num2[len - 1] = num2[len - 1] / 2;
}while(turn != 0);
for(int i = num - 1; i >= 0; i--){
printf("%d", ans[i]);
}
printf("\n");
}
return 0;
}
总结:解题思路30位十进制的数,2的10次方1024,则二进制的数需要100位。一般的整型位数小,需要使用字符串对数据进行处理。
错误点:单字符转数字,使用强制转化得到的数不同。本题的测试数据为非负数,则需要考虑0这种情况。
新知识:单字符转数字,将单字符-‘0’可以得到。