主要考察的就是大数的进制互化,了解人来做转换的原理就可以了。
因为按照算法转换完的新进制下的数刚好是颠倒的,而本题刚好要求颠倒后的二进制对应的十进制,所以可以直接连用两次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;
}
京公网安备 11010502036488号