当前位置: 首页 > article >正文

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


http://www.kler.cn/a/4012.html

相关文章:

  • 利用 LNMP 实现 WordPress 站点搭建
  • Python爬取豆瓣图书网Top250 实战
  • CAPL数据库操作
  • 【Java】LinkedHashMap (LRU)淘汰缓存的使用
  • 在Linux上如何让ollama在GPU上运行模型
  • c语言第一天
  • Mybatis配置之别名(typeAliases)优化、设置(settings)优化、映射器(mappers)优化以及生命周期和作用域的学习和理解
  • C#,码海拾贝(02)——复数Complex计算类,《C#数值计算算法编程》源代码升级改进版
  • 初识冯诺依曼体系结构
  • #详细介绍!!! 线程池的拒绝策略(经典面试题)
  • 【精彩点评】比特币如何颠覆和改善全球供应链体系并彻底改变行业现状
  • 【SpringBoot】| 邮箱发送验证码,你会了吗?
  • ChatGPT相关核心算法
  • AutoSAR COMM-通信管理器通信通道ID【ComMChannelId】的定义
  • 【lwIP(第四章)】网络接口
  • MYSQL——美团面试题
  • 2023选择网络安全,抓住时代机遇!
  • I.MX6ULL_Linux_驱动篇(32) 设备树GPIO驱动
  • Winform/Csharp中使用Linq的Where条件筛选、Select字段映射(左外连接并设置无匹配时默认值)、OrderBy(排序并自定义排序规则)
  • Excel2010(详细解析)
  • 动态内存函数malloc,calloc,realloc详解
  • 金色传说:SAP-ABAP-SAPLINK 零基础萌新/老鸟通用-SAPLINK最详细使用方式(附:神级SQL编辑器ZTOAD完整导入文件)
  • Web前端:什么是Angular?能做什么?
  • CSDN 编程竞赛四十期题解
  • 【LeetCode】栈和队列练习 4 道题
  • 广度优先寻路算法(一)