1 条题解

  • 0
    @ 2026-6-19 10:31:02

    📝 题目大意

    给定两个整数 a,ba, baba \leq b),判断连续整数乘积 i=abi\prod_{i=a}^{b} i 的符号:正数输出 Positive,负数输出 Negative,零输出 Zero

    💡 解题思路

    1. 题目分析:数据范围 [109,109][-10^9, 10^9],直接计算乘积显然会溢出。本题本质是符号判定问题,只需分析区间 [a,b][a, b] 内整数的符号分布,无需真正计算乘积。
    2. 算法推导
      • 情况一:a>0a > 0。区间内所有整数均为正数,乘积必为正,直接输出 Positive
      • 情况二:a0ba \leq 0 \leq b。区间包含 00,任何数与 00 相乘结果为 00,输出 Zero
      • 情况三:a<0a < 0b<0b < 0。区间内所有整数均为负数,乘积的符号取决于负数因子的个数 cnt=ba+1cnt = b - a + 1
        • cntcnt 为奇数,奇数个负数相乘结果为负,输出 Negative
        • cntcnt 为偶数,偶数个负数相乘结果为正,输出 Positive
    3. 边界与细节
      • 注意 aa 可能等于 00,此时落入情况二,输出 Zero
      • 判断顺序不能颠倒:必须先判断 a>0a > 0,再判断区间是否包含 00,最后处理全负区间。若先判断全负再判断含 00,会导致 a=1,b=0a = -1, b = 0 这类数据出错。
      • 变量 id = m - n + 1 可能达到 2×1092 \times 10^9,在 int 范围内(约 2.1×1092.1 \times 10^9),不会溢出。

    ⏱️ 复杂度分析

    • 时间复杂度:仅需若干次常数时间的比较和算术运算,O(1)O(1)
    • 空间复杂度:仅使用几个整数变量,O(1)O(1)

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
        int n, m; scanf("%d%d", &n, &m);  // n = a, m = b
        // 情况一:区间全为正数
        if (n > 0) { puts("Positive"); return 0; }
        // 情况二:区间包含 0
        else if (n <= 0 && m >= 0) { puts("Zero"); return 0; }
        // 情况三:区间全为负数,计算负数个数
        int id = m - n + 1;  // 区间内整数的个数
        // 奇数个负数相乘为负,偶数个为正
        if (n < 0 && m < 0 && id % 2) { puts("Negative"); return 0; }
        else puts("Positive");
        return 0;
    }
    
    • 1

    信息

    ID
    847
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者