题目描述
对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们乘B为A的二进制逆序数。 例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。
输入描述:
一个1000位(即10^999)以内的十进制数。
输出描述:
输入的十进制数的二进制逆序数。
示例1
输入
173
输出
181
代码参(chao)考(xi)的别人的,学习了
#include <stdio.h>
#include <string.h>
char ch1[1000],ch2[4000]; //ch1保存用户输入的10进制大整数,ch2保存ch1转换后的翻转的2进制
int num[1000]; //保存ch2转换的新的2进制大整数!
void Ten_two_convers(){ //十进制数转换成2进制数int len = strlen(ch1);int sum = 1;int flag = 0;int a;int b;while(sum){ //循环,当ch1字符数组每位都是0的时候,循环结束b = 0;sum = 0;ch2[flag++] = (ch1[len-1] - '0')%2 + '0';for(int i = 0; i < len; i++){if(b == 0){a = (ch1[i] - '0');ch1[i] = a/2 + '0';}else{a = ch1[i] - '0' + 10;ch1[i] = a/2 + '0';}if(a%2 == 0){ //此处一定是a%2,一b = 0;}else{b = 1;}sum = sum + a/2;}}
}
int Two_ten(){ //2进制数转换成10进制数!!!!!!这个思路是借鉴了这种思想:比如2进制1010 =(((0*2+1)*2+0)*2+1)*2+0=10int len2 = 1;num[0] = 0;for(int i = 0; i < strlen(ch2); i++){for(int j = 0; j < len2; j++ ){ //各位循环乘2if(j == 0){num[j] = num[j] * 2 + ch2[i] - '0';}else{num[j] = num[j] * 2;}}for(int j = 0; j < len2; j++){if(j == len2 - 1&&num[len2-1] >= 10){num[j] = num[j]%10;num[++j] = 1; //超过10就进位len2++; //扩大一位}else if(num[j] >= 10){num[j] = num[j]%10; //超过10就进位num[j+1]++;}}}return len2;
}
int main(){while(scanf("%s",ch1) != EOF){memset(ch2,0, sizeof(ch2)); //将ch2清空Ten_two_convers();int len2 = Two_ten();for(int i = len2-1; i >= 0; i--){printf("%d",num[i]);}printf("\n");}return 0;
}