众所周知,十进制转其他进制使用的算法是除基取余法。
代码描述就是:
int z[50],cnt=0;
do{
z[cnt++]=y%q; //转为q进制数
y/=q;
}while(y!=0);
这样z数组从高位z[num-1]到低位z[0]即为Q进制z。
不使用while而使用do…while的原因:如果y恰好等于0,那么并没有把z[0]赋为0,且num也没有自加。因此确定y为正数的情况下,就可以用while,否则用do…while。
甚至还可以用递归算法:
C语言库函数中的itoa
函数也可以实现将int
型十进制数转换为其他进制。
但是如果需要转换的十进制数并不能用基本类型表示呢(位数比较多)。该十进制数需要用int
型或char
型数组表示。那么除基取余算法就需要使用高精度的除法运算和取余运算。
代码如下:
string converse(int m,string a,int n){ //将m进制的数a转换为n进制
int k,t;
string b="";
for(int i=0;i<a.size();){
k=0; //上一位遗留的余数
for(int j=i;j<a.size();j++){
t=(k*m+a[j]-'0')%n;
a[j]=(k*m+a[j]-'0')/n+'0';
k=t;
}
b+=to_string(k); //余数
while(a[i]=='0') i++; //清除前置0
}
reverse(b.begin(),b.end()); //倒转
return b;
}