🎉🎉🎉点进来你就是我的人了
博主主页:🙈🙈🙈戳一戳,欢迎大佬指点!
人生格言:当你的才华撑不起你的野心的时候,你就应该静下心来学习!欢迎志同道合的朋友一起加油喔🦾🦾🦾
目标梦想:进大厂,立志成为一个牛掰的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());}}}
}