第一行是两个整数A,B,第二行是一个A进制的字符串,然后将字符串转为B进制数(16进制以内)
注意:第二行输入的是字符串,这是个坑
之所以是字符串是因为10进制以上的会存在字母
就比如16 进制的a就是10
思路:1、先将任意进制转为十进制
2、将十进制转为任意进制
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
//先将A进制字符串转化为十进制
public int changeDecimal(int valueA, String number) {
List list = new ArrayList();
for(int i=0;i<10;i++){
list.add(String.valueOf(i));
}
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
int len = number.length();
int result = 0;
for (int i = 0; i < len; i++) {
int a = list.indexOf(String.valueOf(number.charAt(len - i - 1)));
result = result + Integer.valueOf(a) * (int) Math.pow(valueA, i);
}
return result;
}
//将十进制字符串转化为B进制
public String change(int valueB, int number) {
int temp1 = number;
int temp2 = 0;
String[] s = new String[16];
String str = new String(" ");
for(int i=0;i<16;i++){
if (i == 10) {
s[i]="a";
} else if (i == 11) {
s[i]="b";
} else if (i == 12) {
s[i]="c";
} else if (i == 13) {
s[i]="d";
} else if (i == 14) {
s[i]="e";
} else if (i == 15) {
s[i]="f";
} else {
s[i]=String.valueOf(i);
}
}
while (temp1 >= valueB) {
temp2 = temp1 % valueB;
temp1 = temp1 / valueB;
str = str.concat(s[temp2]);
}
return str.concat(s[temp1]);
}
public static void main(String[] args) {
Main main = new Main();
Scanner sc = new Scanner(System.in);
int valueA = sc.nextInt();
int valueB = sc.nextInt();
String number = sc.next();
sc.close();
int data = main.changeDecimal(valueA, number);
StringBuffer ss = new StringBuffer(main.change(valueB, data));
System.out.println(ss.reverse().toString().trim());
}
}
第一次做的时候遇到的问题
1,将A进制转化为十进制时只考虑了十进制一下的转化
即每一位乘以对应的A次方
但对于大于十进制的会存在字母,比如
16 10
a
将16进制的a转化为十进制,这样就不能直接用a乘16的0次方;
得先将字母a转化为对应的数值
2,然后接下来就是将十进制转化为任意其他进制
需要注意到就是转为十以上进制时的字母转化问题
第一次做的时候感觉到处都是bug,感觉很复杂,
做出来之后就感觉没什么挺简单的,
代码还可以简化,比如char数组…