题目链接:
10进制 VS 2进制http://www.nowcoder.com/share/jump/437195121691738172415
描述
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。 例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入描述:
一个1000位(即10^999)以内的十进制数。
输出描述:
输入的十进制数的二进制逆序数。
示例1
输入:
173
输出:
181
思路:
- 输入一个十进制数
s
。 - 使用大整数除法函数
divide
将s
不断除以 2,得到二进制数的各个位,存放在向量binary
中,顺序是按位逆序排列的。 - 初始化一个字符串
res
为 "0",用于存放最终的结果。 - 遍历
binary
中的每一位,将res
乘以 2(相当于左移一位),然后加上当前位的值,得到二进制逆序数的十进制表示。 - 输出最终的二进制逆序数。
注意:代码中使用了字符串来表示大整数,通过模拟除法、乘法和加法操作,实现了对二进制逆序数的计算和转换。
源代码:
cpp
#include<iostream>
#include<string>
#include<vector>
using namespace std;
// 例题6.3 KY26 10进制 VS 2进制
// 字符串表示的大整数除法
string divide(string str, int x) {
int reminder = 0; // 余数
for (int i = 0; i < str.size(); i++) {
int current = reminder * 10 + str[i] - '0'; // 当前位的数值
str[i] = current / x + '0'; // 更新当前位的值为商的字符表示
reminder = current % x; // 更新余数
}
int pos = 0;
while (str[pos] == '0') {
pos++; // 移除前导零
}
return str.substr(pos); // 返回除法结果,移除前导零
}
string multiple(string str, int x) {
int carry = 0; // 进位
for (int i = str.size() - 1; i >= 0; i--) {
int current = x * (str[i] - '0') + carry; // 当前位的计算结果
str[i] = current % 10 + '0'; // 更新当前位的值为计算结果的个位
carry = current / 10; // 更新进位
}
if (carry != 0) {
str = "1" + str; // 处理最终的进位
}
return str;
}
string Add(string str, int x) {
int carry = x; // 初始进位为 x
for (int i = str.size() - 1; i >= 0; i--) {
int current = (str[i] - '0') + carry; // 当前位的计算结果
str[i] = current % 10 + '0'; // 更新当前位的值为计算结果的个位
carry = current / 10; // 更新进位
}
if (carry != 0) {
str = "1" + str; // 处理最终的进位
}
return str;
}
int main() {
string s;
cin >> s; // 输入十进制数
vector<int> binary; // 用于存放二进制逆序的每一位
while (s.size() != 0) {
int last = s[s.size() - 1] - '0'; // 取最后一位
binary.push_back(last % 2); // 将最后一位的余数(二进制的最低位)存入 vector
s = divide(s, 2); // 将十进制数除以 2,得到下一轮迭代的数值
}
// 将得到的 binary 中的按位逆序排列的二进制数转换为十进制数
string res = "0"; // 初始化结果为 0
for (int i = 0; i < binary.size(); i++) {
res = multiple(res, 2); // 将结果乘以 2,相当于左移一位
res = Add(res, binary[i]); // 加上当前位的值
}
cout << res << endl; // 输出最终的二进制逆序数
return 0;
}