POJ44:正整數的任意進制轉換
阿新 • • 發佈:2017-12-22
sed end 範圍 code lap 另一個 .get ++ ont
44:正整數的任意進制轉換
描述 | |
將 p 進制 n 轉換為 q 進制。p 和 q 的取值範圍為【2,36】,其中,用到的數碼按從小到大依次為:0,1,2,3,4,5,6,7,8,9,A,B,...,Z,不考慮小寫字母。 註意:n 的長度不超過50位。 三個數之間用逗號間隔。 |
|
關於輸入 | |
1+m 行, 第1行為 m,表示後面有 m 行,m不小於1. 其後的m行中,每行3個數: 進制p,p進制數n,以及進制 q。 三個數之間用逗號間隔 |
|
關於輸出 | |
轉換後的 q 進制數。 | |
例子輸入 | |
6 |
|
例子輸出 | |
2345678A123
|
1 #include "stdlib.h" 2 #include <iostream> 3 #include<cstring> 4 #include <stdio.h> 5 using namespace std; 6 int main() 7 { 8 int n; 9 cin >> n; 10 for (int i = 0; i < n; i++) 11 {View Code12 char num[800];//設置一個數組儲存q進制數 13 int p, q; 14 cin >> p; 15 cin.ignore(); 16 cin.getline(num, 800, ‘,‘); 17 cin >> q; 18 char res[800]; int count = 0; 19 while (1) 20 { 21 int x = 0; //歸零 22 int len = 0; 23for (int i = 0; i < strlen(num);)//對當前數字進行除q法 24 { 25 while (x < q&&i<strlen(num))//x小於q的時候,直接將它作為余數*p給下一個位數 當i達到最後時直接將其作為余數存進另一個數組 26 { 27 if (num[i] >= ‘A‘&&num[i] <= ‘Z‘) 28 x = x*p + num[i] + 10 - ‘A‘; 29 else x = x*p +num[i]- ‘0‘; 30 num[i] = ‘0‘; 31 i++; 32 } 33 if (x >= q)//x比q大的時候,進行除法 34 { 35 if (x / q > 9) num[i - 1] = x / q + ‘A‘ - 10; 36 else num[i - 1] = x / q + ‘0‘; 37 x %= q; 38 } 39 } 40 if (x > 9)//余數進行轉換以後存入數組res 41 res[count++] = x - 10 + ‘A‘; 42 else 43 res[count++] = x + ‘0‘; 44 len = -1; 45 for(int i=0;i<strlen(num)&&num[i]==‘0‘;i++) 46 { 47 len = i; 48 } 49 if (strlen(num) - len < 2) 50 break; 51 } 52 for (int i = count - 1; i >= 0; i--) 53 cout << res[i]; 54 cout << endl; 55 } 56 }
這個真的花了蠻長時間的
並不知道除k取余法是個什麽鬼
- 感謝poj提問區的大佬們的點撥
POJ44:正整數的任意進制轉換