编程题 进制转换(Java实现)
🎉🎉🎉点进来你就是我的人了
博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!
人生格言:当你的才华撑不起你的野心的时候,你就应该静下心来学习!欢迎志同道合的朋友一起加油喔🦾🦾🦾
目标梦想:进大厂,立志成为一个牛掰的Java程序猿,虽然现在还是一个🐒嘿嘿
谢谢你这么帅气美丽还给我点赞!比个心
进制转换
解题思路: 将一个十进制的数转化成N进制,我们最容易想到就是除商逆向取余法:除以n(商),逆向取余数,直到商为0为止,我们将得到的余数逆序输出就可以得到我们想要的N进制!
怎样将输出的结果逆序拿到最容易想到有两种方法,第一种是递归,第二种就是栈!
此处我们采用的是栈这种数据结构给大家讲解:
需要注意的是输入的十进制数可能为负数,可以定义一个标志位flag用于判断这个数的状态!
默认(正数)为false!当发现这个数是负数后,将其转化为正数,并将flag置为true表示该数为负数,然后在代码末尾加个if语句判断一下,如果标志位为true,就在栈里面添加个负号,最后将栈里面的数据依次弹出来输出即可!(同时别忘记处理n>9时,后面的余数要用字符表示,参考16进制)
代码演示:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int m = in.nextInt();
int n = in.nextInt();
//我们用除商(商就是n)取余法求转换后的n进制,逆向取余数
//此处我们用栈先进后出的特性,逆向拿到想要的余数
Deque<Object> stack = new ArrayDeque<>();
boolean falg =false; //判断输入的这个数是不是负数
if(m < 0) {
m = -m;
falg =true;
}
//如果m比n小就不需要转换了
if (m < n) {
if (m <= 9) {
stack.push(m);
} else if (m == 10) {
stack.push("A");
} else if (m == 11) {
stack.push("B");
} else if (m == 12) {
stack.push("C");
} else if (m == 13) {
stack.push("D");
} else if (m == 14) {
stack.push("E");
} else if (m == 15) {
stack.push("F");
}
} else {
//这个循环通过除商(n)依次拿到n进制的每个数
while (m != 0) {
int result = m % n;
if (result <= 9) {
stack.push(result);
} else if (result == 10) {
stack.push("A");
} else if (result == 11) {
stack.push("B");
} else if (result == 12) {
stack.push("C");
} else if (result == 13) {
stack.push("D");
} else if (result == 14) {
stack.push("E");
} else if (result == 15) {
stack.push("F");
}
m =m/n;
}
}
if(falg == true) { //如果是负数加个负号
stack.push("-");
}
while(!stack.isEmpty()) {
System.out.print(stack.poll());
}
}
}
}
大家有没有这样的代码是不是过于冗余呢,可不可以继续优化呢?
我们可以定义一个字符串保存取余后需要入栈的数字和字符,直接将取余后的数
作为这个字符串的下标,通过下标依次从这个字符串里面取出需要的数字或者字符
存进栈里面,就可以减少大量的if else判断了!
下面是代码演示:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int m = in.nextInt();
int n = in.nextInt();
//我们用除商(商就是n)取余法求转换后的n进制,逆向取余数
//此处我们用栈先进后出的特性,逆向拿到想要的余数
Deque<Object> stack = new ArrayDeque<>();
//定义一个字符串,每次取余后从这个字符串里取出对应的数
String str ="0123456789ABCDEF";
boolean falg =false; //判断输入的这个数是不是负数
if(m < 0) {
m = -m;
falg =true;
}
//如果m为0不需要转换
if(m == 0) {
stack.push("0");
}
while(m != 0) {
stack.push(str.charAt(m%n));
m /=n;
}
if(falg == true) { //如果是负数加个符号
stack.push("-");
}
while(!stack.isEmpty()) {
System.out.print(stack.poll());
}
}
}
}