对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。 例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入描述:
一个1000位(即10^999)以内的十进制数。
输出描述:
输入的十进制数的二进制逆序数。
示例1
输入
173
输出
181
解题思路:
从题目中可以得到输入的十进制数非常大,因此要用到高精度运算。
类似于之前的进制转化例题:
进制转换 N的阶乘 a+b 高精度整数运算小结
AC代码:
#include<iostream>
#include<string>
#include<string.h>
#include<stdio.h>
using namespace std;
#define maxn 3001
struct bigInt {
int d[maxn];
int size;
void init() {//初始化
for (int i = 0; i < maxn; i++) {
d[i] = 0;
}
size = 0;
}
void set(char str[]) {//提取字符串
init();
int len = strlen(str);
for (int i = len - 1; i >= 0; i--) {
d[size++] = str[i] - '0';
}
}
void output() {//输出函数
for (int i = size - 1; i >= 0; i--) {
printf("%d", d[i]);
}
if (size == 0) printf("0");
printf("\n");
}
};
bigInt mul(bigInt a, int x) {//大整数乘普通整数
bigInt res;
res.init();
int carry = 0;
for (int i = 0; i < a.size; i++) {
int tmp = x*a.d[i] + carry;//carry不参与乘法运算
carry = tmp / 10;
tmp %= 10;
res.d[res.size++] = tmp;
}
while (carry > 0) {
res.d[res.size++] = carry % 10;
carry /= 10;
}
return res;
}
bigInt add(bigInt a, bigInt b) {//十进制 大整数与大整数相加
bigInt res;
res.init();
int carry = 0;
for (int i = 0; i < a.size || i < b.size; i++) {
int tmp = a.d[i] + b.d[i] + carry;
carry = tmp / 10;
tmp %= 10;
res.d[res.size++] = tmp;
}
while (carry > 0) {
res.d[res.size++] = carry % 10;
carry /= 10;
}
return res;
}
bigInt div(bigInt a, int x) {//大整数除普通整数
bigInt res;
res.init();
int carry = 0;//这里不再是进位,而是余数
for (int i = a.size - 1; i >= 0; i--) {
int t = (carry * 10 + a.d[i]) / x;
int r = (carry * 10 + a.d[i]) % x;
res.d[i] = t;
carry = r;
}
res.size = 0;
for (int j = a.size - 1; j >= 0; j--) {
if (res.d[j] != 0) {//找到最高有效位
res.size = j + 1;
break;
}
}
return res;
}
int mod(bigInt a, int x) {//大整数对普通整数取余
int carry = 0;//这里不再是进位,而是余数
for (int i = a.size - 1; i >= 0; i--) {
int t = (carry * 10 + a.d[i]) / x;
int r = (carry * 10 + a.d[i]) % x;
carry = r;
}
return carry;//返回余数
}
char num1[1001];//存放10进制的大数
char num2[100001];//存放2进制的大数
int main() {
bigInt a, b;
while (scanf("%s", num1) != EOF) {
a.set(num1);
int size = 0;//代表转化为2进制后的字符个数
do {
int t = mod(a, 2);//求余数
num2[size++] = t + '0';
a = div(a, 2);
} while (a.d[0] != 0 || a.size != 0);//a不为0时重复上述过程
a.set("0");
b.set("1");//保存权重
for (int i = size - 1; i >= 0; i--) {//将2进制转化为十进制
int t = num2[i] - '0';
if (t > 0) {
a = add(a, mul(b, t));
}
b = mul(b, 2);//更新权重
}
a.output();
}
return 0;
}