【字节青训营算法题】实现36进制加法 2022.04.24

扎哇太枣糕
优质创作者: Java技术领域
2022-04-24 19:45:31
加精

🚨 题目

36进制由0-9,a-z,共36个字符表示。
要求按照加法规则计算出任意两个36进制正整数的和,如1b + 2x = 48 (解释:47+105=152)
要求:不允许使用先将36进制数字整体转为10进制,相加后再转回为36进制的做法

🚩 题解

  36进制的加法毕竟也是数学里的一种加法运算,依然遵循加法进位的原则,只不过之前的十进制加法是满十进位,而36进制加法是满36进一。于是按照进位思想来进行代码编写,由于需要相加运算的时候需要使用十进制,相加之后又需要将结果转成36进制,所以我在这里写了两个工具方法getChar和getInt将参数转为36进制和10进制。
  首先和十进制加法运算一样,是从低位开始进行运算,所以需要获取两位加数的长度,从后往前循环运算。循环体也就是运算过程就是进位的过程,定义了一个carry用来记录进位数。这里以1b + 2x为例,进入for循环第一次将"b"和"x"转换为十进制11和33,十进制相加为44,44大于36肯定会产生进位,进位数就是44对36取模carry=1,余数使用getChar转换为36进制就是结果的个位数,StringBuilder 的sb就是用来接收36进制加法的结果。循环体前两行的三目运算赋值可以用来应对最高位运算后依然有进位的情况,在这个情况下carry肯定是个大于0的正整数,两位的位数已算完故此时ij都为负数,剩下的的就是进位carry转36进制了。
  最后我们StringBuilder 的sb结果是从个位开始运算的,所以sb也要倒序输出才是最终结果。

🚥 代码

public class HelloWorld {

    static String add(String a, String b) {
        int i = a.length() - 1, j = b.length() - 1;
        int carry = 0;
        StringBuilder sb = new StringBuilder();
        for (; i >= 0 || j >= 0 || carry > 0 ; i--,j--) {
            int x = i >= 0 ? getInt(a.charAt(i)) : 0;
            int y = j >= 0 ? getInt(b.charAt(j)) : 0;
            int sum = x + y + carry;
            sb.append(getChar(sum % 36));
            carry = sum / 36;
        }
        return sb.reverse().toString();
    }

    /**
     * 将十进制整数转化为 36进制字符
     * @param n
     * @return
     */
    public static char getChar(int n) {
        if (n <= 9) {
            return (char) (n + '0');
        } else {
            return (char) (n - 10 + 'a');
        }
    }

    /**
     * 将36 进制字符转化为 10进制整数
     * @param c
     * @return
     */
    public static int getInt(char c) {
        if (c <= '9') {
            return c - '0';
        } else {
            return c - 'a' + 10;
        }
    }

    public static void main(String[] args) {

        System.out.println(add("1b", "2x" ));
    }
}
...全文
503 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

316,045

社区成员

发帖
与我相关
我的任务
社区描述
欢迎加入几何心凉的前端社区,本社区活动丰富可以拿到众多周边礼物,本社区还对接Vue技能树可以更加系统的进行学习,还为大家定期举办博主成长计划,助您赢在CSDN同时带您遨游在前端技术的海洋中!!
前端学习经验分享 个人社区 北京·丰台区
社区管理员
  • 几何心凉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

诚挚的邀请大家加入几何心凉社区,在这里您可以结实挚友、提升技术、分享经验、成就自己

  • 【社区活动】本社区受官方长期扶持,您可以通过活动打造个人IP,让更多的人受益于您的分享,同时我们还会奉上精美周边;
  • 【赢在CSDN】社区会对社区成员开设博主扶持计划,集结优质博主分享成长经验,更是疑问在线解答,定期直播连麦,只要您是本社区成员皆可免费享受此权益,让我们携手共进助您速获万粉头衔;
  • 【Vue技能树】本社区创建人同时作为Vue技能树构建者,可为本社区开设技能树投稿通道,获得此权益后我们的高质量的文章被技能树收录获得更多曝光机会;
  • 【简历/就业指导】本社区创建者目前兼职高校就业指导,如果您是学生准备找工作或者您是职场人在应聘中遇到任何问题都可以在这里寻求帮助,我们会定期开设简历审查、面试技巧等就业方面的直播讲解;
  • 【技术交流】任何语言任何方向的技术文章我们都可以汇聚于此,大家可以摸鱼时间可以来此处提升自己,遨游在技术的海洋中;
  • 【立码吐槽】不管你是学生还是打工人,相信在生活中肯定有不断的新鲜事发生,这些事情可以是令你高兴的(比如今天过生日)可以是伤心的(比如我们丢了一个发卡)当然还会有很多,不满、发泄、求安慰等等,那么你可以在这个专栏中做出分享,求一句生日快乐、上岸顺利、加油老铁等等暖心的话;相信我们社区的伙伴看到后一定会速来吐槽;
  • 【bug记录】开发中的坑、学习中的雷,我们皆可投递于此,让更多的人借着分享精准避免从而高效开发;
  • 【更多】更多专栏正在筹备中。。。如果您是社区成员、如果您想为社区建设贡献力量,可以私聊社区管理员;

试试用AI创作助手写篇文章吧