题目描述:
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数。
例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入:
一个1000位(即10^999)以内的十进制数。
输出:
输入的十进制数的二进制逆序数。
样例输入:
173
样例输出:
181
参考代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define M 300
#define N 10001
struct bigInt {
int digit[M];
int size;
void init() {
memset(digit, 0, sizeof digit);
size = 0;
}
void output() {
for (int i = size - 1; i >= 0; i--) {
if (i != size - 1) {
printf("%04d", digit[i]);
}
else {
printf("%d", digit[i]);
}
}
printf("\n");
}
void set(char str[]) {//将字符串转化为高精度整数,4位为一组
init();
int len = strlen(str);
for (int i = len - 1, j = 0, t = 0, c = 1; i >= 0; i--) {
t += (str[i] - '0')*c;
c *= 10;
j++;
if (j == 4 || i == 0) {
digit[size++] = t;
c = 1; t = 0;
j = 0;
}
}
}
void set2(int x) {//将小正数转化为高精度整数,4位为一组
init();
do {
digit[size++] = x % 10000;
x /= 10000;
} while (x);
}
bigInt operator +(const bigInt &A)const {
bigInt ret;
ret.init();
int carry = 0;
for (int i = 0; i < size||i<A.size; i++) {
int tmp = A.digit[i] + digit[i]+carry;
carry = tmp / 10000;
tmp %= 10000;
ret.digit[ret.size++] = tmp;
}
if (carry != 0) {
ret.digit[ret.size++] = carry;
}
return ret;
}
bigInt operator *(int x) const {
bigInt ret;
ret.init();
int carry = 0;
for (int i = 0; i < size; i++) {
int tmp=x*digit[i]+carry;
carry=tmp/10000;
tmp %= 10000;
ret.digit[ret.size++] = tmp;
}
if (carry != 0) {
ret.digit[ret.size++] = carry;
}
return ret;
}
bigInt operator /(int x)const {//高精度整数与普通整数相除
bigInt ret;
ret.init();
int rem = 0;
for (int i = size - 1; i >= 0; i--) {
int t = (rem * 10000 + digit[i]) / x;
int r = (rem * 10000 + digit[i]) % x;
ret.digit[i] = t;
rem = r;
}
ret.size = 0;//若结果为0
for (int i = 0; i < M; i++) {
if (digit[i] != 0)
ret.size = i;
}
ret.size++;
return ret;
}
int operator %(int x)const {//高精度整数与普通整数取余运算
bigInt ret;
ret.init();
int rem = 0;
for (int i = size - 1; i >= 0; i--) {
int t = (rem * 10000 + digit[i]) / x;
int r = (rem * 10000 + digit[i]) % x;
ret.digit[i] = t;
rem = r;
}
return rem;
}
};
char str[N];
int buf[N];
int main() {
while (scanf("%s", str) != EOF) {
int cnt = 0;
int len = strlen(str);
bigInt a, b, c;
b.set2(0);
c.set2(1);
a.set(str);
do {//转换为2进制
int t = a % 2;
a = a / 2;
buf[cnt++] = t;
} while (a.digit[0] != 0 || a.size != 1);
for (int i = cnt - 1; i >= 0; i--) {//转换为10进制
b = b + c*buf[i];
c = c * 2;
}
b.output();
}
return 0;
}