思路:先将任意进制数转换为十进制,再将十进制数转换为任意进制数
一般,任意进制转换为十进制数时,“按权位展开”即可;而十进制数转换为任意进制数时,使用“除该进制取余,逆序排列”即可。
任意进制数转换为十进制数
D=Xn-1*Bn-1+ Xn-2*Bn-2+Xn-3*Bn-3+……. + X0*B0
如:(1101)2=1*2(4-1)+1*2(3-1)+0*2(2-1)+1*2(1-1)=13
package arithmetic;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* 任意两种进制的转换
* 思路:先将任意进制数转换为十进制,再将十进制数转换为任意进制数
*
*/
public class SysConvert {
public static void main(String[] args) {
//键盘扫描器
Scanner scanner=new Scanner(System.in);
System.out.println("输入数的进制类型:");
int jz1=scanner.nextInt();
System.out.println("输入要转换的数:");
String num=scanner.next();
System.out.println("要转换的进制类型:");
int jz2=scanner.nextInt();
dToX(xToD(num, jz1),jz2);
}
/**
* 整数幂运算
* @param num 整数
* @param n 幂次数
* @return 整数的幂运算结果
*/
private static int int_pow(int num,int n){
return n==0 ? 1:num*int_pow(num, n-1);
}
/**
* 将十进制数转换为任意进制数
* @param dnum 十进制数
* @param jz 目标进制
*/
private static void dToX(int dnum,int jz){
//保存目标进制数的各位数字
List<Character> xnum=new ArrayList<Character>();
//十进制数大于进制时
while(dnum>=jz){
if(dnum%jz<=9){
xnum.add((char)(dnum%jz+'0'));
}else {
xnum.add((char)(dnum%jz-10+'A'));
}
//获取商值
dnum=dnum/jz;
}
//当数字小于目标进制
if(dnum<=9){
xnum.add((char)(dnum+'0'));
}else{
xnum.add((char)(dnum-10+'A'));
}
for(int i=xnum.size()-1;i>=0;i--){
System.out.print(xnum.get(i));
}
}
/**
* 任意进制数转换为十进制
* @param num 任意进制数
* @param jz 任意数的进制
* @return 十进制数
*/
private static int xToD(String num,int jz){
//十进制数
int dnum=0;
//每位数的值
int bit=0;
for(int i=0;i<num.length();i++){
//取出每位数
char ch=num.charAt(i);
//小写字母
if(ch>='a'){
bit=(ch-'a')+10;
}else if(ch>='A'){//大写字母
bit=(ch-'A')+10;
}else{
bit=ch-'0';
}
//使用位权法
dnum+=bit*int_pow(jz,num.length()-1-i);
}
return dnum;
}
}
运行结果:
输入数的进制类型:
16
输入要转换的数:
BC0D
要转换的进制类型:
10
48141