【c++】进制转换,1.将十进制转换为二进制;2.将某进制转换为另一进制

1.将十进制转换为二进制

原理:利用短除法

以8为例

8/2 = 4…0
4/2 = 2…0
2/2 = 1…0
1/1 = 0…1
看余数0001,倒过来就是1000,也就是8的二进制

以12为例

12/2 = 6…0
6/2 = 3…0
3/2 = 1…1
1/2 = 0…1
看余数0011,倒过来就是1100,也就是12的二进制

代码逻辑

  1. 获取十进制数据
  2. 将十进制数据按位存入数组中
  3. 对数组的十进制数据进行除2操作
  4. 获取除法的余数,存入结果中
  5. 重复3-4直到除完(除到0时)

代码实现

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;

int main(){
	string num;
	string res;
	// 1.获取十进制数据
	cin>>num;
	// 2.将十进制数据按位存入数组
	vector<int> num_;
	for(int i=0;i<num.size();i++){
		num_.push_back(num[i]-'0');
	}
	// 5.重复直到除完(除到0时)
	while(num_[0]){
		// 3.对数组的十进制数据进行除2操作
		int c = 0;//上一次的余数
		for(int i=0;i<num_.size();i++){
			int sum = c*10 + num_[i];
			c = sum%2;
			num_[i] = sum/2;
		}	
		// 4.获取除法的余数,存入结果中
		res += to_string(num_[num_.size()-1]%2);
		// 删除高位的0:先反转检测低位,删除低位所有的0,再翻转
		reverse(num_.begin(),num_.end());
		while(num_.size()!=0&&num_.back()==0)num_.pop_back();
		reverse(num_.begin(),num_.end());
	}
	reverse(res.begin(),res.end());
	cout<<res<<endl;
}

测试数据

54 -》 110110

2.将某进制转换为另一进制

10进制以上时,a代表10,b代表11…,z代表35

原理

之前计算sum时

int sum = c*10 + num_[i];
c = sum%2;
num_[i] = sum/2;

对于a进制转换为b进制,只需要把代码转换为

int sum = c*a + num_[i];
c = sum%b;
num_[i] = sum/b;

代码逻辑

  1. 获取a,b分别为多少进制
  2. 获取a进制数据
  3. 将a进制数据按位存入数组中(这里需要注意一个点,需要将a-z转换为10-35)
  4. 对数组的a进制数据进行除b操作
  5. 获取除法的余数,存入结果中(这里需要注意一个点,需要将10-35转换为a-z)
  6. 重复3-4直到除完(除到0时)

代码实现

#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;

int main(){
	string num;
	int a,b;
	//0. 获取a,b分别为多少进制
	cin>>a>>b;
	//1. 获取a进制数据
	cin>>num;
	vector<int> num_;
	//2. 将a进制数据按位存入数组中(这里需要注意一个点,需要将a-z转换为10-35)
	for(int i=0;i<num.size();i++){
		// 转换前为字符
		if(num[i]>'9'){
			//与a差值加上10,例如c-a = 2, 2+10 = 12,那么c就是12
			num_.push_back(num[i]-'a'+10);
		}else{
			//否则直接计算与0的差值
			num_.push_back(num[i]-'0');	
		}
	}
	
	string res;
	//5. 重复3-4直到除完(除到0时)
	while(num_[0]){
		int c = 0;
		//3. 对数组的a进制数据进行除b操作
		for(int i=0;i<num_.size();i++){
			int sum = c*a + num_[i];
			c = sum%b;
			num_[i] = sum/b;
		}	
		//获取除法的余数,存入结果中(转换前为数字,与上面的大于字符9不同,这里是大于数字9)
		if(c>9){
			//c++字符串的'+='相当于append
			res += c-10+'a';
		}
		else{
			res += to_string(c);		
		}
		// 删除高位的0:先反转检测低位,删除低位所有的0,再翻转
		reverse(num_.begin(),num_.end());
		while(num_.size()!=0&&num_.back()==0)num_.pop_back();
		reverse(num_.begin(),num_.end());
	}
	reverse(res.begin(),res.end());
	cout<<res<<endl;
}

测试数据

33 32
8mj8repaadc7281dc5amn
结果:
g27n52qldie5v0qsf1l0f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值