九度OJ 題目1208:10進制 VS 2進制


一.題目描述:

        對於一個十進制數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;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章