华为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));
        }
    }
全部评论

相关推荐

渴望wlb的牛油果很...:直说卡第一学历不就行了 非得拐弯抹角
点赞 评论 收藏
分享
天降大厂offer:你是我见过最美的牛客女孩
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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