題目:進制轉換類
題目描述
將M進制的數X轉換爲N進制的數輸出。
輸入
第一行,一個整數T,代表測試數據組數。
接着T行,輸入32位二進制數
輸出
輸出X的N進製表示的數。
測試樣例
輸入
10 2
11
輸出
1011
注意:注意輸入時如有字母,則字母爲大寫,輸出時如有字母,則字母爲小寫。
剛一看題,懵了,以前哪裏聽過三十六進制,嚇壞我了,不過當你瞭解三十六進制就是所謂的 16進制後面用 G H I … Z 後,便豁然開朗了(ง •̀_•́)ง |
---|
思路:
1、先處理輸入過程,賦值給相應的值
2、將M進制的X轉換爲10進制
3、將10進制數轉換爲N進制
4、輸出處理
程序如下:
#include <iostream>
#include <stack>
#include <math.h>
using namespace std;
/**
* 一個十進制整數轉換爲N進制之間的任意進制數輸出
* @param ary :要轉換的進制
* @param num :要轉換的數
*/
void Dec_To_All(int ary, long long int num) {
int temp = 0;
stack<char> number_stack;
if (ary <= 36 || ary > 1) { //不滿足條件則退出
if (ary > 1 && ary < 10) { //2-9進制
while (1) {
temp = num % ary; //進制轉換
number_stack.push(temp + '0'); //壓棧,這裏需要加上 '0' 因爲棧定義爲char類型
num = num / ary; //計算剩餘數
if (num == 0)
break;
}
} else if (ary == 10) //10進制
cout << num << endl;
else if (ary > 10 && ary < 36) { //11-36進制
while (1) {
temp = num % ary ; //進制轉換
if(temp > 9)
temp = temp - 10 + 'a'; //設置爲a 開始,輸出爲a
else
temp = temp + '0'; //這裏轉換爲字符
number_stack.push(temp); //壓棧
num = num / ary; //計算剩餘數
if (num == 0)
break;
}
}
while (!number_stack.empty()) {
cout << number_stack.top(); //得到棧頂元素
number_stack.pop(); //出棧
}
}
}
/**
* 任意進制轉換爲10進制
* @param ary 目前的進制數
* @param num 要轉換的數
* @return
*/
long long int All_to_Dec(int ary, string num) {
long long int result = 0;
long long int temp = 0, i = 0;
if (ary > 36 || ary < 0)
return 0;
for (int j = 0; j < num.size(); ++j) {
if (num[j] >= '0' && num[j] <= '9') {
temp = (num[j] - '0') * pow(ary, num.size() - 1 - j); //計算這個字母對應的數字
} else if (num[j] >= 'A' && num[j] <= 'Z') {
temp = (num[j] - 'A' + 10) * pow(ary, num.size() - 1 - j); //計算這個字母對應的數字
}
result += temp;
}
return result;
}
/**
* 將M進制的數X轉換爲N進制的數輸出。(2<=M,N<=36)
*/
int main() {
int M = 0, N = 0;
string X = ""; //要轉換的數
cin >> M >> N; //獲取初始進制數M和目標進制數N
cin >> X; //需要轉換的數
long long int dec_num = All_to_Dec(M, X); //M進制轉換爲十進制數,這裏需要用long long才能存下
Dec_To_All(N, dec_num); //十進制轉換爲N進制
return 0;
}
注意:
- 使用了棧Stack進行存儲,一定要將壓入的元素都轉換爲棧定義的類型
- 記住
‘A’ = 65
‘a’=97
'0' = 48
這些常用的ASCII碼對應的值
End