华为OD机试真题 - N进制减法

    static char[] map = new char[35];
    public static void main(String[] args) {
        for (int i = 0; i < map.length; i++) {
            if (i < 10)
                map[i] = (char) ('0' + i);
            else
                map[i] = (char) ('a' + i - 10);
        }
        Scanner inputScanner = new Scanner(System.in);

        int base = inputScanner.nextInt();
        String num1 = inputScanner.next(); // 被减数
        String num2 = inputScanner.next(); // 减数
        StringBuilder num1Builder = new StringBuilder(num1);
        StringBuilder num2Builder = new StringBuilder(num2);
        if (num1Builder.length() > num2Builder.length()) {
            System.out.print(0 + &quot; &quot;);
            System.out.print(getResult(num1Builder, num2Builder, base));
        } else if (num1Builder.length() < num2Builder.length()) {
            System.out.print(1 + &quot; &quot;);
            System.out.println(getResult(num2Builder, num1Builder, base));
        } else {
            for (int i = 0; i < num1Builder.length(); i++) {
                if (num1Builder.charAt(i) > num2Builder.charAt(i)) {
                    System.out.print(0 + &quot; &quot;);
                    System.out.print(getResult(num1Builder, num2Builder, base));
                    break;
                } else if (num1Builder.charAt(i) < num2Builder.charAt(i)){
                    System.out.print(1 + &quot; &quot;);
                    System.out.println(getResult(num2Builder, num1Builder, base));
                    break;
                }
                if (num1Builder.length() - 1 == i) {
                    System.out.print(0 + &quot; &quot;);
                    System.out.print(0);
                }
            }

        }
    }

    public static String getResult(StringBuilder num1Builder, StringBuilder num2Builder, int base) {
        StringBuilder ans = new StringBuilder();
        num1Builder.reverse();
        num2Builder.reverse();
        for (int i = 0; i < num1Builder.length(); i++) {
            if (i >= num2Builder.length()) {
                ans.append(num1Builder.substring(i, num1Builder.length()));
                break;
            }

            char num1 = num1Builder.charAt(i);
            char num2 = num2Builder.charAt(i);
            if (num1 >= num2)
                ans.append(map[num1 - num2]);
            else {
                backtrack(num1Builder, 1 , i, base);
                ans.append(map[num1 + base - num2]);
            }
        }
        return ans.reverse().toString();
    }

    public static void backtrack(StringBuilder num1Builder, int index, int i, int base) {
        if (num1Builder.charAt(i + index) != '0') {
            char ch = num1Builder.charAt(i + index);
            num1Builder.delete(i + index, i + index + 1);
            num1Builder.insert(i + index, (char)(ch - 1));
        } else {
            backtrack(num1Builder, index + 1 , i, base);
            num1Builder.delete(i + index, i + index + 1);
            num1Builder.insert(i + index, (char)(base - 1));
        }
    }
全部评论

相关推荐

Java抽象带篮子:简历怎么写可以看看我发的帖子,你的第一个是实习经历吗?那怎么写的是你的第一个练手项目呢?简历写的怎么样直接投小厂面试一下就知道了
没有实习经历,还有机会进...
点赞 评论 收藏
分享
鼠鼠第一次实习,啥也不懂一直是自己一个人吃的饭,不会做工作老是被嫌弃,大人的世界是这样的吗?
我是星星我会发亮:好的mt有两种,一种愿意教你的,一种几乎什么活都不给你派让你很闲允许你做自己事情的
实习吐槽大会
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务