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的二进制
代码逻辑
- 获取十进制数据
- 将十进制数据按位存入数组中
- 对数组的十进制数据进行除2操作
- 获取除法的余数,存入结果中
- 重复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;
代码逻辑
- 获取a,b分别为多少进制
- 获取a进制数据
- 将a进制数据按位存入数组中(这里需要注意一个点,需要将a-z转换为10-35)
- 对数组的a进制数据进行除b操作
- 获取除法的余数,存入结果中(这里需要注意一个点,需要将10-35转换为a-z)
- 重复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