{超简单} C++ 进制转换实用函数

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;
}

  • 17
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值