ACM-任意的十進位制數轉成R進位制
阿新 • • 發佈:2019-02-19
原題是這樣的:
Description
輸入一個十進位制數N,將它轉換成R進位制數輸出。
Input
輸入資料包含多個測試例項,每個測試例項包含兩個整數N(32位整數)和R(2<=R<=16, R<>10)。
Output
為每個測試例項輸出轉換後的數,每個輸出佔一行。如果R大於10,則對應的數字規則參考16進位制(比如,10用A表示,等等)。
Sample Input
7 2
23 12
-4 3
Sample Output
111
1B
-11
首先,我們要弄明白十進位制的數是怎樣轉化為R進位制的,然後再來談程式語言的實現。
十進位制的數轉成二進位制,最常用的方法,就是除R取餘法,將十進位制的數n除以R取其餘數,這裡得到的餘數是R進位制數的最後一位。比如:7轉化為2進位制,先用7%2得到的是1,這裡的1是轉化後的二進位制數的 最後一位,再接著,令n=n/R,即為除得的整數結果(注意,這裡的n需要大於0,因為後續會產生重複的操作),同上例n=7/2=3;再同以上的方法將,3%2=1作為2進位制數的倒數第二位。以此類推,2進位制數的倒數第三位等於3/2%2=1;這時n=0了,迴圈到此終止,二進位制的數為111(注意是從第1位讀到最後一位),即是說,程式碼實現時需要逆序輸出(這裡很容易想到用陣列來存取每一個餘數)。逆序輸出我們很熟悉,若R進位制的數共有X位,令n=X-1;n往下移動一位一直到n=0,對陣列進行輸出。for迴圈可以方便的實現。到此一個十進位制的數轉化成10進位制以內任意R進位制功能就實現了。
在接下來,考慮11到16進位制的轉化,很明顯,因為有了字母的引入。不能直接對於陣列進行直接的輸出。這裡,可以使用switch case 或者是if語句。倒順序的每次判斷均輸出一個結果,輸出結束別忘了加上\n換行。
另外:PS別忘了對於0以及負數的單獨判斷。負數先轉換為正數,按以上的方法輸出後,再加上一個符號位(這裡的符號位要在最開始輸出);0則是直接等於0;
以下是程式程式碼的實現
#include<stdio.h>
int main()
{
long n;
int a[1000],b,i,j,r;
while (scanf("%ld%d",&n,&r)!=EOF)
{
i=0;
if(n<0){n=-n;printf("-");}//對於負數,事先完成取正的轉化,並在輸出的最開始加上符號位
if(n==0)
printf("0");//對於0,則是直接輸出0
while(n>0)
{
b=n%r;
a[i++]=b;
n=n/r;
}//將R進位制的數字按照逆序依次儲存到a陣列中,注意在a陣列中他們是按照順序儲存的,最後一位R進位制數在第一位,以此類推
i=i-1;//i移動到陣列的最後一位下標(實際是R進位制的第一位數)
for(j=i;j>=0;j--)
{
switch(a[j])
{
case 10:printf("A");break;
case 11:printf("B");break;
case 12:printf("C");break;
case 13:printf("D");break;
case 14:printf("E");break;
case 15:printf("F");break;
default :printf("%d",a[j]);
}
}//對超過10 的數進行判斷,解釋如上
/*
if(a[j]==10) printf("A"); else if(a[j]==11) printf("B"); else if(a[j]==12) printf("C"); else if(a[j]==13) printf("D"); else if(a[j]==14) printf("E"); else if(a[j]==15) printf("F"); else printf("%d",a[j]); //這裡有兩種方法都可以完成
*/
printf("\n");
}
return 0;
} //程式結束,完成。