题目描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。 输入描述:
多组数据,每行为一个长度不超过30位的十进制非负整数。 (注意是10进制数字的个数可能有30个,而非30bits的整数)
输出描述:
每行输出对应的二进制数。
示例1
输入
0
1
3
8输出
0
1
11
1000
思路:
- 输入数据的存储:C++中没有能够直接存储30位10进制的数据结构,所以对于输入数据的存储使用数组进行,
char str[31]
- 多行输入:使用while循环,输入使用
scanf("%s",str)!=EOF
- 将字符数组转换为数字数组,便于之后的运算
- 二进制输出可利用栈“先进后出”的特点进行存储
- 大数的除法:思想还没参悟透,就先死记硬背一下吧
for(int i=0;i<strlen(str);)
{
int temp=0,remain=0;//余数
for(int j=i;j<strlen(str);j++)
{
int temp = (num[j]+remain*10)%2;
num[j] =(num[j]+remain*10)/2;
remain=temp;
}
s.push(remain);
while(num[i]==0)//从第一个非0开始
i++;
}
完整代码:
#include<iostream>
#include<stack>
#include<string.h>
#include<stdio.h>
using namespace std;
int main()
{
//多行输入
char str[31];
int num[31];
while(scanf("%s",str)!=EOF)
{
//将字符转为数字
for(int i=0;i<strlen(str);i++)
{
num[i]=str[i]-'0';
}
stack<int> s;
for(int i=0;i<strlen(str);)
{
int temp=0,remain=0;//余数
for(int j=i;j<strlen(str);j++)
{
int temp = (num[j]+remain*10)%2;
num[j] =(num[j]+remain*10)/2;
remain=temp;
}
s.push(remain);
while(num[i]==0)//从第一个非0开始
i++;
}
while(!s.empty())
{
cout<<s.top();
s.pop();
}
}
}