题目描述
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数。 例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入描述:
一个1000位(即10^999)以内的十进制数。
输出描述:
输入的十进制数的二进制逆序数。
示例1
输入
173
输出
181
题目解析:首先将数字转化为二进制,再将二进制反过来计算。但是题目给的number值超过了机器正数表示范围,所以使用数组或者字符串进行大数运算。
除法的计算:
根据这种形式可以逐位计算,算出结果。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<string.h>
#include<map>
#include<vector>
using namespace std;
const int MaxSize = 1001;
string conversion(int m, string number, int n){
int len = number.size(),k=0;
string b;
for (int i = 0; i < len;){
k = 0;
//计算余数,并且将number更新
for (int j = i; j <len; j++) //12345 / 2 变成 06172 那么下次跳过了数字为0的下标,从6开始
{
int t = (k*m + number[j] - '0') % n; //除法计算低一位与高一位的余数有关,向下传递一个余数
number[j] = (k*m + number[j] - '0') / n +'0';
k = t;
}
b += char(k + '0');
while (number[i]=='0')
i++; //跳过这一次产生的高位的0
}
return b;
}
int main()
{
string number,b,c;
while (cin >> number){
b = conversion(10, number, 2);
number = conversion(2, b, 10);
reverse(number.begin(), number.end());
cout << number << endl;
}
}
943

被折叠的 条评论
为什么被折叠?



