转换十进制
对于十进制123我们可以表示成为\(3*10^0+2*10^1+1*10^2\),而同样对于2进制转换称为10进制可以用相同的方法,即将进制基数从最低位开始从0次方开始与其该位的数字相乘。
例如:
二进制1110转换十进制,进制基数就是2,从最低位\(2^0\)开始计算:
对于其他进制转换为十进制其方法时一样的,将进制基数从最低位0次方开始每次乘以该位上的数然后相加。
int base = 1; //进制基数初始化为1,应为最低位0次方等于1
int num = 1110; //需要转换为十进制的数
int result = 0; //保留结果
int baseNum = 2; //进制基数
while(num != 0){
result = result + num%10 * base; //对10取余是为了取到当前num的最低位
num = num /10; //将已经计算了的最低位去除
base = base * baseNum //进制位的平方进一;
}
printf("%d",result);
十进制转换到二进制
十进制转换到二进制我们一般用除位取余法,即将十进制数每次都除以需要转换的进制基数,保留每次的余数,然后将商继续除位取余,直到商为0;
例如将十进制数11转换为二进制数:
11除以2,得商为5,余数为1:
5除以2,得商为2,余数为1:
2除以2,得商为1,余数为0:
1除以2,得商为0,余数为1,算法终止。
将余数从后往前输出,得1011即为11的二进制数。
int num = 14; //需要转换的十进制数
int save[100001] = {-1}; //用一个数组来保存转换后的结果
int baseNum = 2; //进制基数
int counter = 0;
while(num != 0){
save[counter++] = num%baseNum; //保存当前余数
num = num/baseNum; //去除最低位
}
//将结果数组逆向打印
for(int i = counter-1; i >=0; i--){
printf("%d",save[i]);
}
进制转换到进制
我们可以得到一个简单的思想,对于将任意进制转换到任意进制,我们只需要将该进制转换为10进制,然后再用除位取余将该10进制转换为指定进制即可。
#include<stdio.h>
#include<iostream>
using namespace std;
class Solution{
public:
/*
baseNum: 需要转换的进制数
base: 需要转换的进制数的进制
converBase: 需要转换到几进制
*/
void bastToBase(int baseNum,int base,int converBase){
int sumFirstBase = 0; //用来存储baseNum转换到十进制的数
int product = 1; //用来提高BaseNum每次末尾的进制位
while(baseNum != 0){ //循环,每次都抹掉最低位,直到为0
sumFirstBase+=(baseNum%10)*product; //每次等于sumFirstBase自身加上当前baseNum最低位乘以单前的进制位
baseNum/=10; //抹掉最低位
product*=base; //提高一次进制位
}
int result[10000] = {-1}; // 用一个数组来存储这个转换结果
int num = 0;
do{
result[num++] = sumFirstBase%converBase; //将sumFirstBase对需要转换的进制取余,得到的余数存进数组
sumFirstBase/=converBase; //将取过一次余的最低位抹掉
}while(sumFirstBase!=0);
//反向打印数组,得到该转换结果
for(int i = (num-1);i >=0;i--){
printf("%d",result[i]);
}
}
};
int main(){
Solution solution;
solution.bastToBase(1103,8,2);
printf("\n");
}
标签:10,转换,进制,int,num,理解,baseNum
From: https://www.cnblogs.com/elunking/p/17573468.html