很經典的問題,自己動手寫了一遍代碼。
不同的是,我沒有采取字母代替高進制數的做法(如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,當然這些其實都可以解決,比如用字符串,用數組。。
這個算法可以算高進制的數,算是一個特點吧,其實也不能。也許還有改進的地方,我沒有仔細想了。