版权声明:本文为博主原创文章,转载请注明出处 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;
}