目錄
Description
- 給定m進制數a,可使用m進制轉n進制算法將其轉換成n進制數b;
- 重要的是它的思想,這個算法的核心就是下文的(I)至(III)三個公式,(I)式關鍵的就在於獲取參數t的值的策略,就是分成了三種情況(/* classic */ ),這種映射的思想很基本,另外就是基本的字符串處理,基本的ASCII碼。
(處理不了大數和浮點數真的想進制轉換隻需用
cin >> hex >> a;
cout << dec << a;
這樣就可以了 )
Procedure
/* M進制轉10進制 */
int RadixM2Dec(char str[], int size, int radix) {
/* ans存放10進制 */
int ans = 0, t;
/* 一般情況下負數就不用管了 */
for (int i = (str[0] == '-' ? 1 : 0); i < size; i++) {
/* classic */
if (str[i] < '9')
t = str[i] - '0';
else if ('A' <= str[i] && str[i] <= 'F')
t = str[i] - 'A' + 10;
else
t = str[i] - 'a' + 10;
/* 加權公式 */
ans = ans * radix + t; /* (I) */
}
return str[0] == '-' ? -ans : ans;
}
/* 10進制轉M進制需要3步,1)轉換後的串以棧形式返回 */
stack<int> Dec2RadixM(int num, int radix) {
stack<int> ans;
while (num) {
/* 公式-仙魔後廚 */
ans.push(num % radix); /* (II) */
num /= radix; /* (III) */
}
return ans;
}
/* 2)把棧中的數字逆序放入int數組 */
int IntStack2Array(int arr[], stack<int> ans) {
int i = 0;
while (!ans.empty()) {
arr[i] = ans.top();
ans.pop();
i++;
}
return i;
}
/* 3)再把int數組翻譯成轉換結果-字符串 */
void IntArray2CharArray(char str[], int arr[], int size) {
for (int i = 0; i < size; i++) {
/* 注意兩種情況加的數字 */
if (arr[i] < 10)
str[i] = arr[i] + 48;
else
str[i] = arr[i] + 55;
}
}
當然10進制轉M進制也可以簡化成如下2步,
stack<int> Dec2Radix(int m, int r) {
stack<int> s;
if (m < 0)
m = -m; // 輸出的時候別忘額外加上負號
do {
s.push(m % r);
m /= r;
} while (m);
return s;
}
string Trans2String(stack<int> s) {
string str = "";
while (!s.empty()) {
if (s.top() < 10)
str.push_back(s.top() + 48);
else
str.push_back(s.top() + 55);
s.pop();
}
return str;
}
2031 進制轉換
- 還用說,直接後半段的倆函數,加上個main函數就完事了
其他
- 由以上討論,如果想獲取m進制數的任意位,或者求任意進制數的各位之和,通式如下,
- 設這個數共k位,進製爲m;
- 設各位和爲qsum,則qsum可由下式獲得