1. 程式人生 > >POJ44:正整數的任意進制轉換

POJ44:正整數的任意進制轉換

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

18,2345678A123,18
15,23456,18
12,2345678,20
16,12345678,23
25,3456AB,21
18,AB1234567,22
例子輸出
2345678A123

114E0
22B7A4
21A976L
7C2136
22JF0G367

技術分享圖片
 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     {
12 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; 23
for (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 }
View Code

這個真的花了蠻長時間的

並不知道除k取余法是個什麽鬼

感謝poj提問區的大佬們的點撥

POJ44:正整數的任意進制轉換