1. 程式人生 > >ACM-任意的十進位制數轉成R進位制

ACM-任意的十進位制數轉成R進位制

原題是這樣的:

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;
} //程式結束,完成。