很经典的问题,自己动手写了一遍代码。
不同的是,我没有采取字母代替高进制数的做法(如16进制用字母abcdefg表示数字),而是采取 用多位数表示数字,如16进制里20表示为:01 04,16则表示为01 00,17表示为0101。以此类推,而对于101-1000进制的数,则用三位数表示,如001 057。
这样做就可以表示进制很大的数了。理论上,这种做法只受限于整形最大值,当然如果换成数组或者字符串表示,还可以突破这个限制。
public class Main {
public static void main(String[] args) {
System.out.println(jinZhiZhuanHuan(352, 10,16));
}
static int jinZhiZhuanHuan(int value,int n,int m){
//value是某进制的数,n为value的进制,m是目标进制
//若进制较高,则用多位表示,例如16进制用两位数表示以为0-15
int n_sign=calculate_radix(n-1);//记录多少位数表示一个数
int n_index=power(10, n_sign);//获取进位的数
int Remainder=0;//记录余数
int Decimal=0;//转化为10进制的值
//转化为10进制数
for(int i=0;;i++){
Remainder=value%n_index;
Decimal+=power(n,i)*Remainder;
value/=n_index;
if(value==0)
break;
}
//十进制数转换成m进制数
int m_value=0;
int m_sign=calculate_radix(m-1);
int m_index=power(10, m_sign);//获取进位的数
for(int i=0;;i++){
m_value+=((Decimal%m)*power(m_index, i));
Decimal/=m;
if(Decimal==0)
break;
}
return m_value;
}
//求一个的的N次方,math里只有double类型的,所以我就自己写了一个
static int power(int a,int n){
if(n==0)
return 1;
while(n>1){
a*=a;
n--;
}
return a;
}
//求一个整数的基数,例如 5251是4位数,基数就为4。
static int calculate_radix(int n){
int radix=0;
while(n!=0){
radix++;
n /= 10;
}
return radix;
}
}
结果示例:
输入:jinZhiZhuanHuan(11114, 16,12)//11114是个16进制数
输出:30102 //12进制数
输入输出都会遵循上面解释的位数表示方法,只是,对于最左边的一位数,理论上需要补0的,实际上却不能补,因为int a=011会转换为8进制数,所以最前面是不能补0的,一样,输出的话,整数不会再前面输出0,当然这些其实都可以解决,比如用字符串,用数组。。
这个算法可以算高进制的数,算是一个特点吧,其实也不能。也许还有改进的地方,我没有仔细想了。