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

2021-06-14 23:24:36 字數 1979 閱讀 6051

原題是這樣的:

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;

以下是程式**的實現

#includeint main()

//對於負數,事先完成取正的轉化,並在輸出的最開始加上符號位

if(n==0) 

printf("0");//對於0,則是直接輸出0

while(n>0)

//將r進製的數字按照逆序依次儲存到a陣列中,注意在a陣列中他們是按照順序儲存的,最後一位r進製數在第一位,以此類推

i=i-1;//i移動到陣列的最後一位下標(實際是r進製的第一位數)

for(j=i;j>=0;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;

} //程式結束,完成。

將二進位制數轉成十進位制數

思路 二進位制的整數部分,可以使用parseint string,2 得到。二進位制小數部分,將是將小數點後的每位二進位制數都轉換成十進位制數,然後將各個位的十進位制數加起來,就是完整的小數部分的十進位制數了 比如 1111011.111的小數部分為 111 轉換過程為 實現為 將二進位制小數部分轉...

十六進製制轉成十進位制

string s 7a int i integer.parseint s,16 long l long.parselong s,16 如果是十六進製制的字串要轉換為十進位制的字串,那也可以用上面的辦法,再接個tostring就行 string s 7a string s1 integer.tostr...

十六進製制以內任意進製數轉十進位制

十六進製制以內任意進製數轉十進位制的c語言實現 include include include include include int parseint char str,int type if type 16 else if tmpchar a tmpchar f else else printf...