1 条题解
-
0
📝 题目大意
给定两个整数 (),判断连续整数乘积 的符号:正数输出
Positive,负数输出Negative,零输出Zero。💡 解题思路
- 题目分析:数据范围 ,直接计算乘积显然会溢出。本题本质是符号判定问题,只需分析区间 内整数的符号分布,无需真正计算乘积。
- 算法推导:
- 情况一:。区间内所有整数均为正数,乘积必为正,直接输出
Positive。 - 情况二:。区间包含 ,任何数与 相乘结果为 ,输出
Zero。 - 情况三: 且 。区间内所有整数均为负数,乘积的符号取决于负数因子的个数 :
- 若 为奇数,奇数个负数相乘结果为负,输出
Negative。 - 若 为偶数,偶数个负数相乘结果为正,输出
Positive。
- 若 为奇数,奇数个负数相乘结果为负,输出
- 情况一:。区间内所有整数均为正数,乘积必为正,直接输出
- 边界与细节:
- 注意 可能等于 ,此时落入情况二,输出
Zero。 - 判断顺序不能颠倒:必须先判断 ,再判断区间是否包含 ,最后处理全负区间。若先判断全负再判断含 ,会导致 这类数据出错。
- 变量
id = m - n + 1可能达到 ,在int范围内(约 ),不会溢出。
- 注意 可能等于 ,此时落入情况二,输出
⏱️ 复杂度分析
- 时间复杂度:仅需若干次常数时间的比较和算术运算,。
- 空间复杂度:仅使用几个整数变量,。
💻 标准代码 (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
- 上传者