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.构造思路
先将数据转换为10进制,再转换为目标进制。
3.总结部分
3.1 目前的问题:
1.二进制输入3仍然可以正常输出(本程序逻辑为将待转换进制的数据先转换为10进制,之后再转换为目标进制,而在转换为10进制的过程中未加入判断函数,最后导致了bug)
2.个人认为运行效率较低,有待优化
有任何bug以及改进建议欢迎评论区留言!!!
Made By L_STUDIO_ACE 2023/3/26 SUN.