华为OD机试真题 Java 实现【N进制减法】【2023 B卷 200分】,附详细解题思路-LMLPHP

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

主管期望你实现一个基于字符串的N进制的减法。
需要对输入的两个字符串按照给定的N进制进行减法操作,输出正负符号和表示结果的字符串。

二、输入描述

输入有三个参数:

第一个参数是整数形式的进制N值,N值范围大小等于2,小于等于35.
第三个参数为被减数字符串;
第三个参数为减数字符串。

有效的字符包括0-9以及小写字母a-z,字符串有效字符个数最大为100个字符,另外还有结尾的\0. 限制:
输入的被减数和减数,除了单独的0以外,不能是以0开头的字符串。 如果输入有异常或计算过程有异常,此时应当输出-1表示错误。

三、输出描述

输出有2个
其一为减法计算的结果,-1表示出错,0表示结果为整数,1表示结果为负数。
其二维表示结果的字符串。

四、Java算法源码

package com.guor.od;

import java.util.*;
import java.util.regex.Pattern;

public class OdTest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 整数形式的进制N值
        int n = sc.nextInt();
        // 被减数字符串
        String subed = sc.next();
        // 减数字符串
        String sub = sc.next();

        if (n < 2 || n > 35) {
            System.out.println("-1");
            return;
        }

        if (!isValid(subed, n) || !isValid(sub, n)) {
            System.out.println("-1");
            return;
        }

        long subed_val = Long.parseLong(subed, n);
        long sub_val = Long.parseLong(sub, n);

        String diff = Long.toString(Math.abs(subed_val - sub_val), n);
        String sign = subed_val >= sub_val ? "0" : "1";

        System.out.println(sign + " " + diff);
    }

    /**
     * @param n     表示被减数和减数是n进制数
     * @param b_sub 被减数
     * @param sub   减数
     * @return 输出正负符号和表示结果的字符串
     */
    public static String getResult(int n, String b_sub, String sub) {
        if (n < 2 || n > 35) {
            return "-1";
        }

        if (!isValid(b_sub, n) || !isValid(sub, n)) {
            return "-1";
        }

        long b_sub_val = Long.parseLong(b_sub, n);
        long sub_val = Long.parseLong(sub, n);

        String diff = Long.toString(Math.abs(b_sub_val - sub_val), n);
        String sign = b_sub_val >= sub_val ? "0" : "1";

        return sign + " " + diff;
    }

    public static boolean isValid(String str, int n) {
        // 含前导的0只有0值本身合法
        if (str.startsWith("0")) {
            return "0".equals(str);
        }

        // 被减数,减数只能包含字符0-9,a-z
        Pattern reg = Pattern.compile("[^a-z0-9]");
        if (reg.matcher(str).find()) {
            return false;
        }

        // 被减数,减数长度最多100
        if (str.length() > 100) {
            return false;
        }

        // 被减数,减数的每位不能超过n
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            // 比如2进制数的每一位不能超过2
            if (c >= '0' && c <= '9' && Integer.parseInt(c + "") >= n) {
                return false;
            }
            // 比如16进制数每一位不能超过f
            if (c >= 'a' && c <= 'z' && c - 87 >= n) {
                return false;
            }
        }

        return true;
    }
}

五、效果展示

1、输入

2 11 1

2、输出

0 10

3、说明

按二进制计算11 -1,计算正常,0表示符号为正数,结果为10。

华为OD机试真题 Java 实现【N进制减法】【2023 B卷 200分】,附详细解题思路-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

华为OD机试真题 Java 实现【N进制减法】【2023 B卷 200分】,附详细解题思路-LMLPHP

08-02 19:53