题目描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入描述:
多组数据,每行为一个长度不超过30位的十进制非负整数。 (注意是10进制数字的个数可能有30个,而非30bits的整数)
输出描述:
每行输出对应的二进制数。
示例1
输入
0 1 3 8
输出
0 1 11 1000
分析:本题中涉及的数位数比较大,因此不能再用int或者long long型,只得采用字符串形式,而字符串形式的除法是本题的关键
#include<iostream>
#include<cstdio>
#include<string>
#include<vector>
using namespace std;
string Divide(string str,int x){
//自定义字符串除法,该方法是本题关键所在
int remainder = 0; //用于保存余数
for(int i=0;i<str.size();i++)
{
int current = remainder*10+str[i]-'0';
//该句与表达式求值中GetNumber函数中语句有同工之妙
str[i]=current/x+'0'; //将字符串中某一位对应的十进制数做除法运算后
//再转换为字符格式
remainder = current%x; //保存新的余数
}
int pos=0;
while(str[pos]=='0')
pos++;//寻找首个非0下标
return str.substr(pos); //删除前置多余的0
}
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); //调用Divide函数进行字符串的除法运算
}
for(int i=binary.size()-1;i>=0;--i)
printf("%d",binary[i]); //逆序输出
printf("\n");
}
return 0;
}
来源:CSDN
作者:努力努力更努力NA
链接:https://blog.csdn.net/xindada559/article/details/104133081