目录
- 专栏导读
- 一、题目描述
- 二、输入描述
- 三、输出描述
- 四、Java算法源码
- 五、效果展示
- 1、输入
- 2、输出
- 3、说明
华为OD机试 2023B卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为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 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。