2022/4/23/18:50更新
vector<int>outNumber;
void superChange(int originBase,int goBase,string number){
deque<int>theNumber;
for(int i=0;i<number.length();i++){
if(number[i]<='9')
theNumber.push_back(int(number[i]-'0'));
else if(number[i]<='Z')
theNumber.push_back(int(number[i]-'A'+10));
else
theNumber.push_back(int(number[i]-'a'+36));
}
while(theNumber.size()){
int res=0;
for(int i=0;i<theNumber.size();i++){
theNumber[i]+=res*originBase;
res=theNumber[i]%goBase;
theNumber[i]/=goBase;
}
outNumber.push_back(res);
while(theNumber.size()&&theNumber.front()==0)
theNumber.pop_front();
}
}
void baseout(){
while(outNumber.size()){
if(outNumber.back()<=9)
cout<<char(outNumber.back()+'0');
else if(outNumber.back()<=35)
cout<<char(outNumber.back()+'A'-10);
else
cout<<char(outNumber.back()+'a'-36);
outNumber.pop_back();
} cout<<endl;
}
以下是旧版
一.利其器
1.准备工作
要完成对未知进制数字的存储,我们可以使用数组,并附带一个变量用来存储该数的位数。
char numberstring[100];int wei=0;
在每次使用后要注意初始化
memset(numberstring,0,sizeof(numberstring));
2.归一处理
我们先把输入的数字统一转化成十进制,以便以后转化为其它进制。
//base:进制 number:输入的数字
int totenint(int base,string number){
int t=0;
for(int i=0;i<number.length();i++){
if(number[i]>='0'&&number[i]<='9')t+=number[i]-'0';
else t+=number[i]-'A'+10;
if(i!=number.length()-1){
t*=base;
}
}
return t;
}
3.转换
//此函数倒序存储数字
//此函数支持负数进制,如-2进制:1、-2、4、-8、16...
void tostring(int base,int n){
if(base<0){int i;
for(i=0;n!=0;++i){
numberstring[i]=abs(n%base);
n-=numberstring[i];
n/=base;
}if(i)wei=i-1;
}
else{int i;
for(i=0;n!=0;++i){
numberstring[i]=n%base;
n/=base;
}if(i)wei=i-1;
}
}
4.输出
void baseout(){
for(int i=wei;i>=0;i--){
if(numberstring[i]>=0&&numberstring[i]<=9)
cout<<char(numberstring[i]+'0');
else
cout<<char(numberstring[i]+'A'-10);
} cout<<endl;
}
二.善其事
计算器设计
Really Neato计算器公司最近邀请你的团队为他们设计一款超级Neato一代计算器。作为计算机科学家,你建议该计算器能够在各种进制之间进行转换。他们认为这是一个很好的想法,并要求你的团队先给出实现进制转换的算法原型。公司经理告诉你,该计算器应该具有以下一些特征:
(1)可以显示7位;
(2)按键除了数字0到9外,还包括大写字母A到F;
(3)支持2~16进制。输入格式:
输入文件中的每行为一个进制转换,包括3个数,第1个数是原进制下的一个整数,第2个数就是原进制,第3个数是转换后的进制。这3个数的两边可能有一个或多个空格。输入数据一直到文件结尾。
输出格式:
实现所有的进制转换,转换后的数右对齐到7位显示。如果转换后的数的位数太多,超过7位,则输出“ERROR”,也是右对齐到。
输入样例:
1111000 2 10 1111000 2 16 2102101 3 10 2102101 3 15 12312 4 2 1A 15 2 1234567 10 16 ABCD 16 15
输出样例:
120 78 1765 7CA ERROR 11001 12D687 D071
//【注意】这是NENU课堂作业的代码,如果想交作业,请自己重写一遍. int main(){ int tennumber,originbase,gobase; string number; while(cin>>number>>originbase>>gobase){ memset(numberstring,0,sizeof(numberstring)); tennumber=totenint(originbase,number); tostring(gobase,tennumber); if(wei>=7) cout<<" "<<"ERROR"<<endl; else{ for(int i=0;i<6-wei;i++)cout<<" "; baseout(); } } return 0; }
更多推荐
{超简单} C++ 进制转换实用函数
发布评论