-
题目描述:
-
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数。
例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
-
输入:
-
一个1000位(即10^999)以内的十进制数。
-
输出:
-
输入的十进制数的二进制逆序数。
-
样例输入:
-
173
-
样例输出:
-
181
-
-
#include <stdio.h> #include <string.h> struct bigInt { int digit[300]; int size; }; void init(bigInt &a) { for(int i = 0; i < 300; i++) a.digit[i] = 0; a.size = 0; } bigInt add(bigInt a, bigInt b) //高精度整数加法 { bigInt ret; init(ret); int bound = a.size > b.size ? a.size : b.size; int carry = 0; for(int i = 0; i < bound; i++) { int tmp = a.digit[i] + b.digit[i] + carry; carry = tmp / 10000; ret.digit[ret.size++] = tmp % 10000; } if(carry != 0) ret.digit[ret.size++] = carry; return ret; } bigInt mul(bigInt a, int x) // 高精度整数乘小整数 { bigInt ret; init(ret); int carry = 0; for(int i = 0; i < a.size; i++) { int tmp = a.digit[i] * x + carry; ret.digit[ret.size++] = tmp % 10000; carry = tmp / 10000; } if(carry != 0) ret.digit[ret.size++] = carry; return ret; } bigInt divide(bigInt a, int x) // 高精度整数除以小整数 { bigInt ret; init(ret); int remainder = 0; for(int i = a.size - 1; i >= 0; i--) { int tmp = a.digit[i] + remainder * 10000; ret.digit[i] = tmp / x; remainder = tmp % x; } ret.size = 0; for(int j = 0; j < 300; j++) if(ret.digit[j] != 0) ret.size = j; ret.size++; return ret; } int mod(bigInt a, int x) // 高精度整数对小整数取模 { int remainder = 0; for(int i = a.size - 1; i >= 0; i--) { int tmp = a.digit[i] + remainder * 10000; remainder = tmp % x; } return remainder; } int main() { char str[1010]; while(scanf("%s",str) != EOF) { char buf[10000]; int top = 0; bigInt input, res; init(input); init(res); int len = strlen(str), i, m = 1; bigInt mid_10; init(mid_10); mid_10.digit[0] = 1; mid_10.size = 1; // 位权重 for(i = len - 1; i >= 0; i--) // 字符串转为高精度整数 { int tmp = str[i] - '0'; input = add(input,mul(mid_10,tmp)); mid_10 = mul(mid_10,10); } /*********************************************** for(i = input.size - 1; i >= 0; i--) { if(i == input.size - 1) printf("%d",input.digit[i]); else printf("%04d",input.digit[i]); } printf("\n"); 输出转换后的十进制高精度整数 *************************************************/ if(input.digit[input.size-1] == 0) printf("0\n"); else { while(input.digit[input.size - 1] != 0) // 十进制高精度整数转化为二进制字符串 { int tmp = mod(input,2); if(tmp == 0) buf[top++] = '0'; else buf[top++] = '1'; input = divide(input,2); // ******************************printf("%c",buf[top-1]); } // **********************************printf("\n"); /************************************ for(i = 0; i < top / 2; i++) { char c = buf[i]; buf[i] = top - 1 - i; buf[top-1-i] = c; } 得到的二进制字符串不用再逆序处理,因为已经是逆序过了的 ****************************************/ bigInt mid; init(mid); mid.digit[0] = 1; mid.size = 1; for(i = top - 1; i >= 0; i--) // 逆序二进制转为十进制 { if(buf[i] == '1') res = add(res,mid); mid = mul(mid,2); } for(i = res.size - 1; i >= 0; i--) // 输出逆序数 { if(i == res.size - 1) printf("%d",res.digit[i]); else printf("%04d",res.digit[i]); } printf("\n"); } } return 0; }