主要考察的就是大数的进制互化,了解人来做转换的原理就可以了。
因为按照算法转换完的新进制下的数刚好是颠倒的,而本题刚好要求颠倒后的二进制对应的十进制,所以可以直接连用两次convert函数,改变x和y即可。
#include<stdio.h> #include<string.h> int str[3000]; // 待处理的数 int ans[3000]; // 新进制下的数 int convert(int x,int y,int str[],int len) // x为原始进制,y为要转化的进制 { int size = 0,carry,i = 0; while(i<len) { carry = 0; for(int j = i;j<len;j++) { int t = (carry * x + str[j]) % y; str[j] = (carry * x + str[j]) / y; carry = t; } ans[size++] = carry; while(str[i]==0 && i<len) i++; } return size; } int main() { char num[1000]; int i; gets(num); // 先把十进制数按照字符一个一个读入 for(i = 0;i<strlen(num);i++) str[i] = num[i]-'0'; // 转成int型存入str(以便在转换进制的时候进行乘除) str[i] = '\0'; int size1 = convert(10,2,str,strlen(num)); // 先将原始的10进制数据转换成待求的二进制数 for(i = 0;i<size1;i++) str[i]= ans[i]; // 把二进制赋回str以备下一次2进制转10进制。 int size2 = convert(2,10,str,size1); // 2进制转10进制 for(i = size2-1;i>=0;i--) // 倒序输出转换后的数 printf("%d",ans[i]); printf("\n"); return 0; }