任意两种进制的转换 偏执的太偏执、 2021-09-22 11:20 304阅读 0赞 **思路:先将任意进制数转换为十进制,再将十进制数转换为任意进制数** 一般,任意进制转换为十进制数时,“按权位展开”即可;而十进制数转换为任意进制数时,使用“除该进制取余,逆序排列”即可。 任意进制数转换为十进制数 **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
还没有评论,来说两句吧...