對於一個十進制數A,將A轉換爲二進制數,然後按位逆序排列,再轉換爲十進制數B,我們乘B爲A的二進制逆序數。
例如對於十進制數173,它的二進制形式爲10101101,逆序排列得到10110101,其十進制數爲181,181即爲173的二進制逆序數。
輸入:
一個1000位(即10^999)以內的十進制數。
輸出:
輸入的十進制數的二進制逆序數。
樣例輸入:
173
樣例輸出:
181
二.題目分析
本題中是進制正反轉換,大數10進制到2進制再到10進制.
#include <stdio.h>
#include <stdlib.h>
//一個1000位(即10^999)以內的十進制數。
int main()
{
int a[2000],b[8000],len,i,j,jie,k=0,chu;
char str[1010];
while(scanf("%s",str)!=EOF)
{
for(i=0;str[i]!='\0';i++)
a[i]=str[i]-'0';
len=i;
k=0;
//模擬長整數除法,由十進制a[]轉換成二進制b[]
while(1)
{
if(a[len-1]%2==0)
b[k++]=0;
else
b[k++]=1;
i=0;
while(a[i]==0&&i<len)
i++;
if(i==len)
break;
jie=0;
for(;i<len;i++)
{
chu=jie*10+a[i];
a[i]=chu/2;
jie=chu%2;
}
}
/* //x爲十進制,也可能超出範圍,用數組a[]表示
x=0;
for(i=0;i<k-1;i++)
{
x=x*2;
x+=b[i];
}*/
for(i=0;i<2000;i++)
a[i]=0;
len=1; //剛開始設置十進制數只有1位
//由二進制b[]轉換成十進制a[],len中保存了當前十進制數的長度
for(i=0;i<k-1;i++) //從0開始,依次加上b[i]
{
//首先a[]中的值都應該乘以進制2(類似於10進制數中先乘以10然後加)
for(j=0;j<len;j++)
a[j]*=2;
//處理進位部分,由於不知道高位的進位有幾位,可使用while來處理
j=0;
while(a[j]!=0||j<len)
{
if(a[j]>=10) //既處理了本位,也處理了高位進位
{
a[j+1]+=a[j]/10;
a[j] %=10;
}
j++;
}
len=j;
//然後進行加法,加b[i]
a[0]+=b[i];
}
for(i=len-1;i>=0;i--)
printf("%d",a[i]);
printf("\n");
}
return 0;
}