题目描述
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。
例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入
一个1000位(即10^999)以内的十进制数。
输出
输入的十进制数的二进制逆序数。
样例输入 Copy
985
样例输出 Copy
623
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct bign {
int d[1005], len;
bign() {
memset(d, 0, sizeof(d));
len = 0;
}
};
bign change(char s[])
{
int len=strlen(s);
int i;
bign a;
a.len=len;
for(i=0;i<len;i++)
{
a.d[i]=s[len-1-i]-'0';
}
return a;
}
bign divide(bign a, int m, int b, int &r){
bign c;
c.len = a.len;
r= 0;
for(int i = a.len - 1; i >= 0; i--){
r = r * m + a.d[i];
if(r < b){
c.d[i] = 0;
}else{
c.d[i] = r / b;
r = r % b;
}
}
while(c.len >= 1 && c.d[c.len - 1] == 0) c.len--;
return c;
}
int main(int argc, char** argv) {
char a[1005], ans[2000];
char bin[3500];
bign x;
while(scanf("%s", a) != EOF){
int r = 0, j = 0;
x = change(a);
while(x.len >= 1){
x = divide(x, 10, 2, r);
bin[j++] = r + '0';
}
bin[j] = '\0';
x = change(bin);
j = 0;
while(x.len >= 1){
x = divide(x, 2, 10, r);
ans[j++] = r + '0';
}
ans[j] = '\0';
for(int m = j - 1; m >= 0; m--){
printf("%c",ans[m]);
}
printf("\n");
}
return 0;
}