C++實現任意進位制的相互轉換

FingertipShow發表於2020-12-01
進位制轉換是計算機內部時時刻刻都在進行活動,本篇文章也是進位制轉換的演算法介紹,不過不同的是我想利用ascll編碼實現2到61之間任意進位制的相互轉換,更大進位制的表示方法只不過是十六進位制表示方法的延伸:用字母A到Z表示整數10到35,字母a到z表示整數36到61。這樣就可以表示2到61之間的任意進位制啦,為方便理解ascll表放在程式碼後面,可以自行檢視。

 

下面直接給上程式碼:

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 void decToOther(int tmp, int b);
 5 void otherToDec(int a, char str[], int b);
 6 const int MAXSIZE = 10000;
 7 int a, b;
 8 char str[MAXSIZE];
 9 int main()
10 {
11     while (cin >> a >> str >> b)          //a、s、b分別為目前的進位制、待轉換的內容、目標進位制
12         otherToDec(a, str, b);            //統一先轉換為10進位制
13     return 0;
14 }
15 
16 void otherToDec(int a, char str[], int b)
17 {//任意進位制轉換為十進位制 
18     int tmp = 0;            //tmp儲存十進位制的值 
19     int c = 1;          //初始化權值為1
20     for (int i = strlen(str) - 1; i >= 0; i--)
21     {
22         int x;          //存放當前位的數字 
23         if (str[i] >= 'A' && str[i] <= 'Z')         //字母A~Z表示整數10~35
24             x = str[i] - 'A' + 10;
25         else if (str[i] >= 'a' && str[i] <= 'z')            //字母a~z表示整數36~61
26             x = str[i] - 'a' + 36;
27         else
28             x = str[i] - '0';
29         tmp = tmp + x * c;          //累加將各個位上的值
30         c = c * a;         //更新權值
31     }
32     decToOther(tmp, b);         //由十進位制轉換為目標進位制
33 }
34 
35 void decToOther(int tmp, int b)
36 {//十進位制轉換為任意進位制 
37     int i = 0;
38     int s[MAXSIZE] = { 0 };
39     while (tmp != 0)            //十進位制轉換為目標進位制演算法,結果放到陣列s中
40     {
41         s[i] = tmp % b;
42         tmp= tmp / b;
43         i++;
44     }
45     cout << a << "進位制數" << str << "" << b << "進製表示為:";
46     for (; i > 0; i--)          //利用ascll編碼實現字母表示兩位整數,並倒序輸出轉換結果
47     {
48         if (s[i - 1] > 9 && s[i - 1] <= 35)
49             cout << (char)(s[i - 1] + 55);          //當s[i-1]為整數10時(char)(10+55)='A',輸出'A'
50         else if (s[i - 1] > 35 && s[i - 1] <= 61)
51             cout << (char)(s[i - 1] + 61);          //當s[i-1]為整數36時(char)(36+61)='a',輸出'a'
52         else
53             cout << s[i - 1];           //個位數輸出本身
54     }
55     cout << '\n';
56 }

 

示例:

 

 

附:ascll表

 

相關文章