E-N进制减法-200分

刷题笔记合集🔗

题目描述

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

输入格式

输入有三个参数:

  1. 第一个参数是整数形式的进制N值,N值范围为[2,35]
  2. 第二个参数为被减数字符串
  3. 第三个参数为减数字符串

输出格式

输出两个值,用空格分隔:

  1. 第一个值表示减法计算的结果符号
    • -1 表示出错
    • 0 表示结果为正数
    • 1 表示结果为负数
  2. 第二个值为表示结果的字符串(出错时不输出)

约束说明

  1. 2 ≤ N ≤ 35
  2. 有效字符包括0-9和小写字母a-z
  3. 字符串最大长度为100
  4. 除了单独的0外,不能有前导0
  5. 每位数字不能超过进制N

样例输入1

2 11 1

样例输出1

0 10

样例说明1

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

样例输入2

8 07 1

样例输出2

-1

样例说明2

按8进制计算,检查到被减数不符合非0前导的要求,返回-1。

题目解析

本题的关键点在于:

  1. 输入验证

    • 进制N的范围检查
    • 字符串格式检查
    • 前导零检查
    • 数位范围检查
  2. 进制转换

    • N进制转十进制
    • 十进制转N进制
    • 处理正负号
  3. 异常处理

    • 输入格式异常
    • 数值范围异常
    • 计算过程异常

实现思路:

  1. 验证输入的合法性
  2. 将N进制数转为十进制
  3. 进行减法运算
  4. 将结果转回N进制
  5. 处理符号和输出

时间复杂度: 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%内容,订阅专栏后可继续查看/也可单篇购买

算法刷题笔记 文章被收录于专栏

本专栏收集并整理了一些刷题笔记

全部评论

相关推荐

评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务