目录
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可由下式获得