- 題目描述:
將M進制的數X轉換爲N進制的數輸出。
- 輸入:
輸入的第一行包括兩個整數:M和N(2<=M,N<=36)。
下面的一行輸入一個數X,X是M進制的數,現在要求你將M進制的數X轉換成N進制的數輸出。
- 輸出:
輸出X的N進製表示的數。
- 樣例輸入:
16 10 F
- 樣例輸出:
15
- 提示:
輸入時字母部分爲大寫,輸出時爲小寫,並且有大數據。
算法關鍵就在模擬長除法的部分,比如在大數情況下,10進制數轉化爲3進制數的長除法:#include<iostream> #include<string> using namespace std; inline int convertFromChar(char ch); inline char convertToChar(int num); bool isZero(int * num, int len); int main() { int M, N; string numFrom; int *fromM, *toN; //M進制和N進制的大數數組 while(cin >> M >> N) { cin >> numFrom; int LEN = numFrom.size(); fromM = new int[LEN]; toN = new int[6 * LEN]; for(int i = 0; i < LEN; i++) fromM[i] = convertFromChar(numFrom.at(i)); for(int i = 0; i < 6 * LEN; i++) toN[i] = 0; //開始做除法和取餘運算 int posTo = 0; while(!isZero(fromM, LEN)) //模擬除法,當M進制的數不爲零時,將其除以N的餘數作爲N進制的對應位,商作爲下一輪的被除數 { int before = 0; for(int i = 0; i < LEN; i++) { int tmp = fromM[i] + M * before; fromM[i] = tmp / N; before = tmp % N; } toN[posTo++] = before; } //輸出(注意toN數組是反序存儲,高位在後,posTo記錄N進制數的最高位的位置) if(posTo > 0)//注意邊界案例 for(int i = posTo - 1; i >= 0; i--) cout << convertToChar(toN[i]); else cout << 0; cout << endl; delete[] fromM; delete[] toN; } //system("pause"); return 0; } int convertFromChar(char ch) { if(ch <= '9' && ch >= '0') return (int)(ch - '0'); else if(ch <= 'Z' && ch >= 'A') return (int)(ch - 'A') + 10; else if(ch <= 'z' && ch >= 'a') return (int)(ch - 'a') + 10; } char convertToChar(int num) { if(num <= 9 && num >= 0) return (char)(num + '0'); else return (char)(num - 10 + 'a'); } bool isZero(int *num, int len) { bool yes = true; for(int i = 0; i < len; i++) if(num[i]) yes = false; return yes; }
參考:http://blog.csdn.net/jaster_wisdom/article/details/52107785