以下的c++代码可以实现任意进制间的转换;
思路:以十进制为跳板,先将其他进制的数字转换为十进制,再将十进制转换为其他进制。
/*
*create by chenzj36
*on 2018/8/1
*实现任意进制间的转换
*/
#include<iostream>
using namespace std;
int int_pow(int x, int y) {//实现幂运算,<iostream>也提供pow()函数
int result = 1;
for (int i = 1 ; i <= y; i++) {
result *= x;
}
return result;
}
void dtoo(int dnum, int jz) {//十进制转其他任意进制
char rnum[100];//利用字符数组存“数字”,按位处理更方便;
int i=0, j;
while (dnum >= jz) {//大于等于欲转化的进制,继续除,取余。
if (dnum%jz <= 9) {
rnum[i++] = dnum % jz + '0';//数字转换为字符
}
else {
rnum[i++] = dnum % jz - 10 + 'A';//大于等于10的部分,用大写字母。
}
dnum = dnum / jz;//取完余数,进行除法操作。
}
if (dnum%jz <= 9) {
rnum[i++] = dnum + '0';
}
else {
rnum[i++] = dnum - 10 + 'A';
}
cout << "转换为" << jz << "进制:";
for (j = i-1; j >= 0; j--) {//将字符数组逆序输出
cout << rnum[j];
}
cout <<endl;
}
int otod(char onum[], int jz) {//其他进制转十进制
int n = 0;
int res = 0;
for (int i = 0; onum[i] != '\0'; i++) {//确定字符数组存储的位数
n++;
}
for (int i = 0; i < n; i++) {
int bas;
if (onum[i] >= 'A') {//将大写字母转为数字
bas = onum[i] - 'A' + 10;
}
else {//将“字符”转“数字”
bas = onum[i] - '0';
}
res += bas * int_pow(jz, n-i-1);//权值*位对应的大小
}
return res;//返回十进制的数
}
void main() {
while (1) {
int orin,jz1,jz2;
char onum[100];
cout << "请输入要转换的数字(字母大写):";//输入任意的“数”
cin >> onum;
cout << "请输入原始数据的进制:";//确定上面数字的进制
cin >> jz1;
cout << "请输入要转换的进制:";//输入要转化的进制
cin >> jz2;
dtoo(otod(onum, jz1), jz2);//调用函数,实现进制转换
}
}