【算法笔记5.6小节 -大整数运算 】F : 10进制 VS 2进制(大数进制转换,大数除法)

版权声明:本文为博主原创文章,转载请注明出处 https://blog.csdn.net/xunalove/article/details/88298536

题目描述

对于一个十进制数A,将A转换为二进制数,然后按位逆序排列,再转换为十进制数B,我们称B为A的二进制逆序数。
例如对于十进制数173,它的二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。

输入

一个1000位(即10^999)以内的十进制数。

输出

输入的十进制数的二进制逆序数。

样例输入

985

样例输出

623

这道题目和上一道进制转换(https://blog.csdn.net/xunalove/article/details/88256745)十分相似

思路也很清晰

#include<stdio.h>
#include<string.h>

struct bign{
    int d[1001];
    int len;
    bign()
    {
        memset(d,0,sizeof(d));
        len = 0;
    }
};
bign change(char a[])//正向存储
{
    bign c;
    for(int i=strlen(a)-1; i>=0; i--)
        c.d[c.len++] = a[i]-'0';
    return c;
}
bign reverse(bign a)
{
    bign c;
    for(int i=a.len-1; i>=0; i--)
        c.d[c.len++] = a.d[i];
    return c;
}

int main()
{
    char a[1001];
    while(scanf("%s",&a)!=EOF)
    {
       bign b = change(a);
       bign temp;//保存二进制数
       while(b.len>0)//转换为二进制
       {
           int carry = 0;
           for(int i=b.len-1; i>=0; i--)
           {
               int t = b.d[i] + carry * 10;
               carry = t%2;
               b.d[i] = t/2;
           }
           temp.d[temp.len++] = carry;
           while(b.d[b.len-1]==0)
              b.len--;
       }

       bign c = reverse(temp), ans;
       while(c.len>0)
       {
           int carry = 0;
           for(int i=c.len-1; i>=0; i--)
           {
               int t = c.d[i] + carry * 2;
               carry = t % 10;
               c.d[i] = t / 10;
           }
           ans.d[ans.len++] = carry;
           while(c.d[c.len-1]==0)
             c.len--;
       }
       for(int i=ans.len-1; i>=0; i--)
            printf("%d",ans.d[i]);
       printf("\n");
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/xunalove/article/details/88298536