E-N进制减法-200分
刷题笔记合集🔗
题目描述
实现一个基于字符串的N进制减法。对输入的两个字符串按照给定的N进制进行减法操作,输出正负符号和表示结果的字符串。
输入格式
输入有三个参数:
- 第一个参数是整数形式的进制N值,N值范围为[2,35]
- 第二个参数为被减数字符串
- 第三个参数为减数字符串
输出格式
输出两个值,用空格分隔:
- 第一个值表示减法计算的结果符号
- -1 表示出错
- 0 表示结果为正数
- 1 表示结果为负数
- 第二个值为表示结果的字符串(出错时不输出)
约束说明
- 2 ≤ N ≤ 35
- 有效字符包括0-9和小写字母a-z
- 字符串最大长度为100
- 除了单独的0外,不能有前导0
- 每位数字不能超过进制N
样例输入1
2 11 1
样例输出1
0 10
样例说明1
按二进制计算11-1,计算正常,0表示结果为正数,结果为10。
样例输入2
8 07 1
样例输出2
-1
样例说明2
按8进制计算,检查到被减数不符合非0前导的要求,返回-1。
题目解析
本题的关键点在于:
-
输入验证
- 进制N的范围检查
- 字符串格式检查
- 前导零检查
- 数位范围检查
-
进制转换
- N进制转十进制
- 十进制转N进制
- 处理正负号
-
异常处理
- 输入格式异常
- 数值范围异常
- 计算过程异常
实现思路:
- 验证输入的合法性
- 将N进制数转为十进制
- 进行减法运算
- 将结果转回N进制
- 处理符号和输出
时间复杂度: O(L),其中L是输入字符串的长度
参考代码
def solve():
try:
# 读取输入
n, b_sub, sub = input().split()
n = int(n)
# 检查进制范围
if n < 2 or n > 35:
return "-1"
# 检查输入格式
if not is_valid(b_sub, n) or not is_valid(sub, n):
return "-1"
# 转换为十进制并计算
b_sub_val = int(b_sub, n)
sub_val = int(sub, n)
# 计算差值和符号
diff = abs(b_sub_val - sub_val)
sign = "0" if b_sub_val >= sub_val else "1"
# 转换为N进制
result = to_base_n(diff, n)
return f"{sign} {result}"
except:
return "-1"
def is_valid(s, n):
# 检查前导零
if s.startswith('0') and s != '0':
return False
# 检查字符范围
for c in s:
if c.isdigit():
if int(c) >= n:
return False
elif c.isalpha():
if ord(c) - ord('a') + 10 >= n:
return False
else:
return False
# 检查长度
return len(s) <= 100
def to_base_n(num, n):
if num == 0:
return "0"
digits = "0123456789abcdefghijklmnopqrstuvwxyz"
result = ""
while num:
result = digits[num % n] + result
num //= n
return result
if __name__ == "__main__":
print(solve())
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
string solve(int n, string b_sub, string sub) {
// 检查进制范围
if (n < 2 || n > 35) return "-1";
// 检查输入格式
if (!isValid(b_sub, n) || !isValid(sub, n)) return "-1";
try {
// 转换为十进制
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
算法刷题笔记 文章被收录于专栏
本专栏收集并整理了一些刷题笔记