class Stack {
int top = 0;
int[] array = null;
public Stack() {
this(10);
}
public Stack(int size) {
this.top = 0;
this.array = new int[size];
}
public boolean isFull() {
return (top == array.length);
}
public void put(int x) {
if(isFull()) { //如果栈满了,就扩容
this.array = Arrays.copyOf(array, array.length*2);
}
array[top] = x;
top++;
}
/**
* 因为2进制、8进制、10进制数每个数都不会大于10,所以如果输出大于10的数必为16进制数
* 而在16进制数中,10~15依次用A B C D E F表示
*/
public void show() {
for(int i = top-1;i >= 0;i--) {
if(array[i] < 10) {
System.out.print(array[i]);
}else {
if(array[i] == 10) {
System.out.print("A");
}
if(array[i] == 11) {
System.out.print("B");
}
if(array[i] == 12) {
System.out.print("C");
}
if(array[i] == 13) {
System.out.print("D");
}
if(array[i] == 14) {
System.out.print("E");
}
if(array[i] == 15) {
System.out.print("F");
}
}
}
System.out.println();
}
}
public class TransitionNumber {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for(;;) {
System.out.print("输入待转换的数的进制: ");
int x = sc.nextInt();
if(x != 2 && x != 8 && x != 10 && x != 16) {
System.out.println("进制不合法!,请重新输入");
continue;
}
System.out.print("输入需要转换后的进制: ");
int y = sc.nextInt();
if(y != 2 && y != 8 && y != 10 && y != 16) {
System.out.println("进制不合法!,请重新输入");
continue;
}
System.out.print("请输入需要转换的数: ");
int i = sc.nextInt();
if(!judge(x,i)) {
System.out.println("你输入的不是"+x+"进制数,"+x+"进制数每个数应该小于"+x);
continue;
}
System.out.print(x+"进制数"+i+"转换为"+y+"进制数后为: ");
decimalTooctonary(y,octonaryTodecimal(x,i)).show();
}
}
/**
* 判断输入的进制数是否正确
* @param x
* @param i
* @return
*/
private static boolean judge(int x, int i) {
String str = String.valueOf(i); //基本数据类型转字符串
char[] cha = str.toCharArray(); //字符串转换成字符数组
if(x == 2) {
for(int j = 0;j < cha.length;j++) {
//字符数组里的每个元素转成int型参与比较
if(Integer.parseInt(cha[j]+"") > 1) {
return false;
}
}
}
if(x == 8) {
for(int j = 0;j < cha.length;j++) {
if(Integer.parseInt(cha[j]+"") > 7) {
return false;
}
}
}
if(x == 10) {
for(int j = 0;j < cha.length;j++) {
if(Integer.parseInt(cha[j]+"") > 9) {
return false;
}
}
}
if(x == 16) {
for(int j = 0;j < cha.length;j++) {
if(Integer.parseInt(cha[j]+"") > 15) {
return false;
}
}
}
return true;
}
/**
* 其他进制转十进制
* @param x
* @param i
* @return
*/
private static int octonaryTodecimal(int x,int i) {
int n = i;
int m = i;
int num = 0;
int b = (int) b(i);
int a = (int) Math.pow(10, b);
while(a >= 1) {
n = m/a;
m = m%a;
a = a/10;
num = n+num*x;
}
return num;
}
/**
*
* @param i
* @return
*/
private static double b(int i) {
int n = i;
int b = 0;
while(n/10 != 0) {
n = n/10;
b++;
}
return b;
}
/**
* 十进制转其他进制
* @param i
* @return
*/
private static Stack decimalTooctonary(int y,int i) {
Stack x = new Stack();
int n = i;
while(true) {
if(n/y != 0) {
x.put(n%y);
n = n/y;
}else {
x.put(n);
return x;
}
}
}
}
运行结果:
输入待转换的数的进制: 16
输入需要转换后的进制: 8
请输入需要转换的数: 544
16进制数 【544】 转换为8进制数后为: 2504
输入待转换的数的进制: 8
输入需要转换后的进制: 2
请输入需要转换的数: 2504
8进制数 【2504】 转换为2进制数后为: 10101000100
输入待转换的数的进制: 8
输入需要转换后的进制: 10
请输入需要转换的数: 2504
8进制数 【2504】 转换为10进制数后为: 1348
输入待转换的数的进制: 8
输入需要转换后的进制: 16
请输入需要转换的数: 10700
8进制数 【10700】 转换为16进制数后为: 11C0
输入待转换的数的进制: 2
输入需要转换后的进制: 10
请输入需要转换的数: 2536
你输入的不是2进制数,2进制数每个数应该小于2
输入待转换的数的进制: 2
输入需要转换后的进制: 10
请输入需要转换的数: 10010
2进制数 【10010】 转换为10进制数后为: 18
输入待转换的数的进制: 2
输入需要转换后的进制: 8
请输入需要转换的数: 10010
2进制数 【10010】 转换为8进制数后为: 22
输入待转换的数的进制: 10
输入需要转换后的进制: 8
请输入需要转换的数: 18
10进制数 【18】 转换为8进制数后为: 22
输入待转换的数的进制: