L1-025 正整数A+B(15分)[java][python]

5 阅读3分钟

题目ID:L1-025 分数:15分 语言:Java / Python

题目描述

本题的目标很简单,就是求两个正整数 A 和 B 的和,其中 A 和 B 都在区间 [1,1000]。稍微有点麻烦的是,输入并不保证是两个正整数。

输入格式

输入在一行给出 A 和 B,其间以空格分开。问题是 A 和 B 不一定是满足要求的正整数,有时候可能是超出范围的数字、负数、带小数点的实数、甚至是一堆乱码。

注意:我们把输入中出现的第1个空格认为是 A 和 B 的分隔。题目保证至少存在一个空格,并且 B 不是一个空字符串。

输出格式

  • 如果输入的确是两个正整数,则按格式 A + B = 和 输出
  • 如果某个输入不合要求,则在相应位置输出 ?,显然此时和也是 ?

样例

输入1

123 456

输出1

123 + 456 = 579

输入2

22. 18

输出2

? + 18 = ?

输入3

-100 blabla bla...33

输出3

? + ? = ?

解题思路

判断一个字符串是否为正整数的规则

  1. 字符串全部由数字组成(不含小数点等其他字符)
  2. 数值在 [1, 1000] 范围内(即 1 <= Integer.parseInt(s) <= 1000

实现步骤

  1. 读取整行,用第一个空格分割得到 A 和 B
  2. 分别判断 A 和 B 是否为正整数
  3. 根据判断结果决定输出内容

Java 中的特殊处理

  • split(" ", 2) 只分割第一个空格,因为输入可能有多个空格
  • 用正则 .matches("\\d+") 判断是否为纯数字

Python 中的处理

  • s.split(" ", 1) 只分割第一个空格
  • str.isdigit() 判断是否为纯数字

代码实现

Java

import java.io.*;
import java.util.*;

public class Main {
    public static boolean isValid(String s) {
        if (s == null || s.isEmpty()) return false;
        // 必须全为数字
        if (!s.matches("\\d+")) return false;
        // 必须在 1~1000 范围内
        int v = Integer.parseInt(s);
        return v >= 1 && v <= 1000;
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String line = br.readLine();
        String[] parts = line.split(" ", 2);
        String A = parts[0];
        String B = parts.length > 1 ? parts[1] : "";

        boolean validA = isValid(A);
        boolean validB = isValid(B);

        if (validA && validB) {
            System.out.println(A + " + " + B + " = " + (Integer.parseInt(A) + Integer.parseInt(B)));
        } else {
            String outA = validA ? A : "?";
            String outB = validB ? B : "?";
            System.out.println(outA + " + " + outB + " = ?");
        }
    }
}

Python

line = input().strip()
# 只分割第一个空格
parts = line.split(" ", 1)
A = parts[0]
B = parts[1] if len(parts) > 1 else ""

def is_valid(s):
    if not s:
        return False
    if not s.isdigit():
        return False
    v = int(s)
    return 1 <= v <= 1000

valid_A = is_valid(A)
valid_B = is_valid(B)

if valid_A and valid_B:
    print(f"{A} + {B} = {int(A) + int(B)}")
else:
    out_A = A if valid_A else "?"
    out_B = B if valid_B else "?"
    print(f"{out_A} + {out_B} = ?")

运行验证

样例1

输入123 456

  • A="123" 是正整数 ✓,B="456" 是正整数 ✓
  • 输出:123 + 456 = 579

样例2

输入22. 18

  • A="22." 含非数字字符 → 无效
  • B="18" 是正整数 ✓
  • 输出:? + 18 = ?

样例3

输入-100 blabla bla...33

  • A="-100" 含负号 → 无效
  • B="blabla bla...33" 含非数字字符 → 无效
  • 输出:? + ? = ?

复杂度分析

  • 时间复杂度:O(L),L 为输入行长度
  • 空间复杂度:O(1)

总结

本题考察字符串解析和合法性判断,关键是理解"第1个空格作为分隔"的规则,以及正整数的判断条件(全为数字且在1~1000范围内)。