數的進制轉換

題目描述

編寫一個程序,可以實現將一個數字由一個進制轉換爲另一個進制。

這裏有62個不同數位{0-9,A-Z,a-z}。

輸入格式

第一行輸入一個整數,代表接下來的行數。
接下來每一行都包含三個數字,首先是輸入進制(十進制表示),然後是輸出進制(十進制表示),最後是用輸入進製表示的輸入數字,數字之間用空格隔開。
輸入進制和輸出進制都在2到62的範圍之內。
(在十進制下)A = 10,B = 11,…,Z = 35,a = 36,b = 37,…,z = 61 (0-9仍然表示0-9)。

輸出格式

對於每一組進制轉換,程序的輸出都由三行構成。
第一行包含兩個數字,首先是輸入進制(十進制表示),然後是用輸入進製表示的輸入數字。
第二行包含兩個數字,首先是輸出進制(十進制表示),然後是用輸出進製表示的輸入數字。
第三行爲空白行。
同一行內數字用空格隔開。

輸入樣例:

8
62 2 abcdefghiz
10 16 1234567890123456789012345678901234567890
16 35 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 23 333YMHOUE8JPLT7OX6K9FYCQ8A
23 49 946B9AA02MI37E3D3MMJ4G7BL2F05
49 61 1VbDkSIMJL3JjRgAdlUfcaWj
61 5 dl9MDSWqwHjDnToKcsWE1S
5 10 42104444441001414401221302402201233340311104212022133030

輸出樣例:

62 abcdefghiz
2 11011100000100010111110010010110011111001001100011010010001
10 1234567890123456789012345678901234567890
16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
16 3A0C92075C0DBF3B8ACBC5F96CE3F0AD2
35 333YMHOUE8JPLT7OX6K9FYCQ8A
35 333YMHOUE8JPLT7OX6K9FYCQ8A
23 946B9AA02MI37E3D3MMJ4G7BL2F05
23 946B9AA02MI37E3D3MMJ4G7BL2F05
49 1VbDkSIMJL3JjRgAdlUfcaWj
49 1VbDkSIMJL3JjRgAdlUfcaWj
61 dl9MDSWqwHjDnToKcsWE1S
61 dl9MDSWqwHjDnToKcsWE1S
5 42104444441001414401221302402201233340311104212022133030
5 42104444441001414401221302402201233340311104212022133030
10 1234567890123456789012345678901234567890

** 題解**:
常規思路,可以先將a進制轉化爲10進制,再轉化爲b進制,
這裏我們提供一個簡便的方法,短除法:可以直接由a進製得到b進制

代碼如下:

#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
int main()
{
    int t;
    cin >> t;
    while(t--){
        int a, b;
        string c, d;
        cin >> a >> b >> c;
        vector<int> arr, res;
        for(int i = c.size() - 1; i >=0; i--){      //反轉得到數組
            if(c[i] >='0' && c[i] <='9')arr.push_back(c[i] - '0');
            if(c[i] >='A' && c[i] <='Z')arr.push_back(c[i] - 'A' + 10);
            if(c[i] >='a' && c[i] <= 'z')arr.push_back(c[i] - 'a' + 36);
        }
        while(arr.size()){    
            int r = 0;
            for(int i = arr.size() - 1; i >=0; i--){ //短除法
                arr[i] += r * a;
                r = arr[i] % b;
                arr[i] /= b;
            }
            res.push_back(r);  //每次將餘數加入到數組中
            while(arr.size() && arr.back() == 0)arr.pop_back();//去除前導0
        }
        for(int i = res.size() - 1; i >= 0; i--){
            if(res[i] >= 0 && res[i] <= 9)d += res[i] + '0';
            if(res[i] >= 10 && res[i] <= 35) d += res[i] + 'A' - 10;
            if(res[i] >= 36)d += res[i] + 'a' - 36;
        }
        cout << a << ' ' << c << endl;
        cout << b << ' ' << d << endl;
        cout << endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章