题目描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入
多组数据,每行为一个长度不超过30位的十进制非负整数。
(注意是10进制数字的个数可能有30个,而非30bits的整数)
输出
每行输出对应的二进制数。
样例输入
985 211 1126
样例输出
1111011001 11010011 10001100110
//思路:本题是对30位的数字转换为二进制那么想到用字符数组存储30位大数,但是问题来了,数组存储的大数如何进行二进制转换?基本思想是在经典二进制转换的基础上上把竖式除法细分(看代码体会吧)。
本题个人感觉确实复杂,下边是代码:(有参考大佬的)
#include<iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
char s[32];
while(scanf("%s", s) != EOF)
{
char z[100] = {0}; //存储二进制数
int num = 0; //二进制数组计数器
int flag; // do while()循环标志位
do
{
flag = 0;
//每进行一次for循环生成一位二进制
for (int i = 0; i < strlen(s); i++)
{
int dec = s[i] - '0';//字符转为十进制
int quotient = dec / 2;
if(quotient != 0) //商不为0仍然do while()循环继续除法
flag = 1;
//转换二进制时的竖式除法
/*需要细节理解下除法的步骤可能平时咱们不太在意
用最高位和下一位合成一个数来除,直到能除以除数为止*/
if (s[i + 1] != '\0') //当前字符的下一字符存在
{
s[i + 1] += (dec % 2 * 10); //第 i+1 位加本位的余数*10(竖式除法)
}
else //当前字符已经是最后一个字符
{
z[num++] = dec % 2 + '0'; //从低位向高位存入取余的字符
}
s[i] = quotient + '0'; //存储下一次for循环计算的商值的一位(字符形式存储 )
}
}while(flag);
for(int i = num - 1; i >= 0; i--)
cout << z[i];
cout << endl;
}
return 0;
}
参考:
https://blog.csdn.net/Zen_Ivan/article/details/105957978