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