九度OJ題目1080:大數的任意進制之間的轉換

題目描述:

將M進制的數X轉換爲N進制的數輸出。

輸入:

輸入的第一行包括兩個整數:M和N(2<=M,N<=36)。
下面的一行輸入一個數X,X是M進制的數,現在要求你將M進制的數X轉換成N進制的數輸出。

輸出:

輸出X的N進製表示的數。

樣例輸入:
16 10
F
樣例輸出:
15
提示:

輸入時字母部分爲大寫,輸出時爲小寫,並且有大數據。


#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;
}
算法關鍵就在模擬長除法的部分,比如在大數情況下,10進制數轉化爲3進制數的長除法:



參考:http://blog.csdn.net/jaster_wisdom/article/details/52107785

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章