進位制轉換是計算機內部時時刻刻都在進行活動,本篇文章也是進位制轉換的演算法介紹,不過不同的是我想利用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表