题目描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入描述:
多组数据,每行为一个长度不超过30位的十进制非负整数。 (注意是10进制数字的个数可能有30个,而非30bits的整数)
输出描述:
每行输出对应的二进制数。
示例1
输入
0 1 3 8
输出
0 1 11 1000
算法思想:
128/2 我们得到64和余数0 ,所以我们得到的0就应该放在最低位,这时我们再把64/2,....以此类推知道被除数为0的时候就计算完成
#include<iostream>
#include<string>
#include<vector>
using namespace std;
string Divide(string str,int x)//更新新字符串(更新被除数)
{
int temp=0;
for(int i=0;i<str.size();i++)
{
int current=str[i]-'0'+temp*10;//将当前字符转化为十进制数,被除数
str[i]=current/x+'0'; //将除后的商再次转化为字符存进字符串
temp=current%x;//余数要和下个字符一起组成新的整形被除数
}
int pos=0;//更新字符串,pos为新字符串的首字符位置
while(str[pos]=='0')
pos++;
return str.substr(pos);//substr函数是取str的字串,字串从pos位置开始一直到最后一个字符
}
int main()
{
string str;
while(cin>>str)
{
vector<int> binary;
while(str.size()!=0)
{
int last=str[str.size()-1]-'0';
binary.push_back(last%2);
str=Divide(str,2);//更新字符串,即上次字符串处理后的“新被除数”
}
for(int i=binary.size()-1;i>=0;i--) //结果要逆序输出才符合要求,不然输出的是转换后的正确二进制的逆序
{
cout<<binary.at(i);
}
cout<<endl;
}
return 0;
}