目录
1.代码部分
话不多说,直接上代码:
#include<iostream>
#include<cstring>
#include<cmath>
#define L_STUDIO_ACE 2009
using namespace std;
typedef unsigned long long int op;//()
char d[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F' };//取余后所得的对应数字
op leave(char x[1919], op y) {//leave函数 将待转换进制的数据转成10进制
op h = 0, k = strlen(x);//h储存转换的10进制数据 k储存目标数据的有效位数
for (op i = k; i > 0; i--) {//for遍历每一位数字
if ('0' <= x[i - 1] && x[i - 1] <= '9') {
h += (x[i - 1] - 48) * pow(y, k - i);//k-i为位权
}
else if ('A' <= x[i - 1] && x[i - 1] <= 'F') {
h += (x[i - 1] - 55) * pow(y, k - i);
}
else {
cout << "DATA ERROR!";
return -1;//错误校验码
break;//退出循环
}//分类讨论
}
return h;
}
void back(op a, op b) {//back函数 将10进制数据转换为目标进制
if (a == -1) {
return;//收到错误校验码后停止执行
}
op r;//r储存该位数字
r = a % b;
a /= b;//短除法
if (a) {
back(a, b);//递归
}
cout << d[r];//由于是倒序读取所以直接输出
return;
}
int main() {
char l[1919];//char数组 方便输入和操作
op s, p;
cout << "进制转换器v1.4.5 Made By L_STUDIO_ACE 2023.3.26 SUN." << endl;
cout << "请输入待转换进制的数据和待转换的进制(仅支持2-16进制的正整数!!!)" << endl;//目前仅支持正整数
cin >> l >> s;
cout << "请输入目标进制" << endl;
cin >> p;//分别输入
cout << "将 " << s << " 进制的 " << l << " 转换成 " << p << " 进制的结果为 " << endl;
back(leave(l, s), p);//leave函数所得的值直接接入back函数作为转换的数据
cin.get();
cin.get();//()
return 0;
}
v1.4.5
2.总结部分
2.1 目前的问题:
1.二进制输入3仍然可以正常输出(原因:本程序逻辑为将待转换进制的数据先转换为10进制,之后再转换为目标进制,而在转换为10进制的过程中未加入判断函数,最后导致了bug)
2.个人认为运行效率较低,有待优化
有任何bug以及改进建议欢迎评论区留言!!!
[已补档]