编程题 进制转换(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());
            }
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

书生-w

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值