十進制整數轉成N進制數

題目描述

輸入一個十進制數N,將它轉換成R進制數輸出。

輸入

輸入數據包含多個測試實例,每個測試實例包含兩個整數N(32位整數)和R(2<=R<=16)。

輸出

爲每個測試實例輸出轉換後的數,每個輸出佔一行。如果R大於10,則對應的數字規則參考16進制(比如,10用A表示,等等)。

樣例輸入

7 2
23 12
-4 3

樣例輸出

111
1B
-11

主要思路是求餘運算,將這個十進制數與進制數求餘,例如將23轉爲12進制,則是23 % 12。在數學上我們做進制轉換是通過短除法不斷求得餘數,然後將得到的所有餘數倒序,來解決這個問題的,但是這個題目需要考慮更多的東西,一個是超過10的進制需要用大寫字母代替,例如16進制裏的ABCDEF,這是題目明示的,還有從樣例裏我們也可以看到負數的轉換,在寫代碼的時候需要處理一下。

我們理一下寫程序的思路,首先我們使用C++ STL的棧來解決倒序問題,將一個個的餘數入棧,最後取出,就可以得到倒序的數組。由於輸出中可能帶有字母,我們用string對象來輸出結果。我先把代碼貼上來:

#include <cstdio>
#include <algorithm>
#include <string>
#include <iostream>
#include <stack>
#include <sstream>

using namespace std;

string trans(int a,int r){
	stack<char> s;
	string res;
    //A:
	if(a < 0){
		a = abs(a);
		res += '-';
	}
    //B:
	if(a < r){
		stringstream s;
		s << a;
		res += s.str();
		return res;
	}
	while(a){
		//cout << a % r << endl;
		if(a % r >= 10){
            //C:
			s.push(a % r - 10 + 'A');
		}
		else{
			s.push(a % r + 48);
		}
		a /= r;
	}
	
	
	while(!s.empty()){
		res += s.top();
		s.pop();
	}
	return res;
}

int main(){

	int n,r;
	while(scanf("%d%d",&n,&r) != EOF){
		cout << trans(n,r) << endl;
	}
	
	return 0;
}

代碼裏我用註釋標註了A B C,便於我講解。首先我寫了一個trans函數來處理進制轉換,a是要轉換的數,r是進制數。在A處我處理負數的情況,就是將要返回的字符串res裏先加入一個負號,然後將數字做絕對值,在接下來的代碼裏按正數處理。在B處我處理傳進來的數不需要轉換的情況,例如輸入一個8讓我們轉成12進制,這個時候直接返回8就行,這裏使用了stringstream來把int轉成string(C++如此麻煩)。然後是C處,C所處的整個循環用於處理餘數併入棧,我分了兩種情況,一是餘數大於10,需要添加字母的情況,二是餘數小於10,不需要添加字母的情況,至於-10 ,+48,這些操作,是爲了將數字轉爲char(ascii)以便後面加入到字符串裏。在trans()函數的最後,遍歷棧s,取出字符並拼接到res裏,返回res。代碼已在OJ上AC。

 

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