c++ 进制转换

目录

一.x进制转10进制

二.10进制转x进制

三.x进制转k进制


一.x进制转10进制

我们都知道10进制的1、10、100......分别是10的0次方、10的1次方、10的2次方......

当然,其他进制中也有这种关系:

如二进制中的1、2、4......分别是2的0次方、2的1次方、2的2次方......

而原数每一位上的数乘以对应的进制的次方,最后将所有位得到的结果相加,最终的结果就是他的10进制数

举几个例(从个位开始计算,倒着乘,括号里面的是进制):

1.1011(2)=1*2^{0}+1*2^{1}+0*2^{2}+1*2^{3}=11(10)

2.2C(16)=C*16^{0}+2*16^{1}=44(10)

所以,程序如下:

#include<iostream>
using namespace std;
int xToTen(string str,int x){
	int yuanShu[str.length()],w=1;//w就是每个位对应的进制的次方,一开始是x的0次方,也就是1
	int jieGuo=0;
	for(int i=0;i<str.length();i++){//char转int
		if(str[i]>='0'&&str[i]<='9')yuanShu[i]=str[i]-'0';//数字
		else yuanShu[i]=str[i]-'A'+10;//字母
	}
	for(int i=str.length()-1;i>=0;i--){//从个位乘起
		jieGuo+=yuanShu[i]*w;
		w*=x;//次方加一,再乘个x
	}
	return jieGuo;
}
int main(){
	int x;//进制
	string str;//x进制数
	cin>>x>>str;
	cout<<xToTen(str,x);
}

运行结果:

二.10进制转x进制

10进制转x进制就好办多了,直接短除法!

下面举两个例子:

1.100转2进制 

2.200转16进制

可以发现,最后一步的商都是0,所以可以以商等于0来作为结束标志 

由于计算后会出现>10的余数(如12),就要将其转换为字母(如C),这时葵花宝典就很好用:

string dictionary="0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ";

代码如下:

#include<iostream>
using namespace std;
string dictionary="0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ";//葵花宝典
string tenToX(int n,int x){
	string jieGuo="",temp="";
	for(int i=0;i<30;i++)jieGuo[i]='\0';//初始化
	while(n!=0){
		temp+=dictionary[n%x];//通过葵花宝典确定余数的字符
		n/=x;
	}
	for(int i=temp.length()-1;i>=0;i--){//反转字符串
		jieGuo+=temp[i];
	}
	return jieGuo;
}
int main(){
	int n,x;//n为10进制数,x为要转换的进制
	cin>>n>>x;
	cout<<tenToX(n,x);
}

三.x进制转k进制

有了前两步打基础,这一步就非常简单啦。只需要将x进制转换为10进制,再将10进制转换为k进制即可(当然还有其他方法,不过这个方法更简单)

程序如下,就不写注释啦:

#include<iostream>
using namespace std;
string dictionary="0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ";
string tenToX(int n,int x){
	string jieGuo="",temp="";
	for(int i=0;i<30;i++)jieGuo[i]='\0';
	while(n!=0){
		temp+=dictionary[n%x];
		n/=x;
	}
	for(int i=temp.length()-1;i>=0;i--){
		jieGuo+=temp[i];
	}
	return jieGuo;
}
int xToTen(string str,int x){
	int yuanShu[str.length()],w=1;
	int jieGuo=0;
	for(int i=0;i<str.length();i++){
		if(str[i]>='0'&&str[i]<='9')yuanShu[i]=str[i]-'0';
		else yuanShu[i]=str[i]-'A'+10;
	}
	for(int i=str.length()-1;i>=0;i--){
		jieGuo+=yuanShu[i]*w;
		w*=x;
	}
	return jieGuo;
}
int main(){
	string str;
    int x,k;
    cout<<"需要转换的数及其的进制:"; 
	cin>>str>>x;
	cout<<"需要转换的进制:"; 
	cin>>k;
	int ten=xToTen(str,x);
	cout<<tenToX(ten,k);
}

运行结果:

如有疑问欢迎私信或评论区留言!

  • 29
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值