進制轉換——36進制

題目:進制轉換類

題目描述

將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

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