描述
将一个长度最多为30位数字的十进制非负整数转换为二进制数输出。
输入描述:
多组数据,每行为一个长度不超过30位的十进制非负整数。 (注意是10进制数字的个数可能有30个,而非30bits的整数)
输出描述:
每行输出对应的二进制数。
示例1
输入示例:
0
1
3
8
输出示例:
0
1
11
1000
思路:
仍然是“除2取余法”,主要的区别在于这次要对一个字符串表示的大整数取余,因为输入的十进制数长度最多为30位数字,只能用字符串来表示。
将输入的十进制数字逐步除以2,并将每一步的余数保存在二进制数数组中。然后,从数组末尾开始输出数组中的元素,以得到正确的二进制表示。
函数 Divided
用于实现字符串表示的大整数的除法操作,并最后还去掉了结果字符串开头多余的0。整个程序通过循环处理多组输入的十进制数字。
源代码:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
// 用于将字符串表示的大整数除以 x,并返回商
string Divided(string str, int x) {
int reminder = 0;
for (int i = 0; i < str.size(); i++) {
int current = str[i] - '0' + reminder * 10; // 将当前位转换为整数并加上上一次的余数
str[i] = current / x + '0'; // 将商转换为字符并保存到字符串中
reminder = current % x; // 更新余数
}
int pos = 0;
while (str[pos] == '0') {
pos++; // 去掉结果字符串开头多余的零
}
str = str.substr(pos); // 更新结果字符串
return str;
}
int main() {
string s;
while (cin >> s) {
vector<int> binary; // 用于存储二进制数的每一位
while (s.size() != 0) {
int last = s[s.size() - 1] - '0'; // 获取字符串最后一位的整数值
binary.push_back(last % 2); // 将最后一位对2取余并保存到二进制数数组中
s = Divided(s, 2); // 将原字符串除以2,得到新的字符串
}
for (int i = binary.size() - 1; i >= 0; i--) {
cout << binary[i]; // 从数组末尾开始输出二进制数,得到正确的二进制表示
}
cout << endl;
}
return 0;
}