![高效求解满足 X(X+1) ∈ [A, B] 的整数 X 个数的数学与编程方法](https://img.php.cn/upload/article/001/246/273/179134058777142.jpg?x-oss-process=image/resize,p_40)
本文介绍如何通过二次不等式分析与根区间截取,精确计算所有整数 x,使得 x(x+1) 落在闭区间 [a, b] 内;核心是利用求根公式确定可行 x 的连续整数范围,并通过集合差集排除边界外值。
本文介绍如何通过二次不等式分析与根区间截取,精确计算所有整数 x,使得 x(x+1) 落在闭区间 [a, b] 内;核心是利用求根公式确定可行 x 的连续整数范围,并通过集合差集排除边界外值。
要解决“求满足 $ X(X+1) \in [A, B] $ 的整数 $ X $ 的个数”这一问题,关键在于将乘积形式转化为标准二次不等式,并借助实数根界定整数解的合法区间。
由于 $ X(X+1) = X^2 + X $,原条件等价于: $$ A \leq X^2 + X \leq B $$ 这可拆分为两个不等式:
- $ X^2 + X - A \geq 0 $ → 要求 $ X $ 不在两根之间的开区间(即取外部或边界);
- $ X^2 + X - B \leq 0 $ → 要求 $ X $ 落在两根之间的闭区间(含端点)。
但直接处理“外部解”易出错(尤其跨正负区间时),更稳健的策略是: 为此,我们定义辅助函数 主逻辑如下: 然而,原答案中“ 满足 $ X(X+1) 因此优化后的 ✅ 验证示例: 该方法融合代数推导与编程实现,兼顾数学严谨性与工程鲁棒性,是解决此类二次整数区间计数问题的典型范式。
✅ 先求出所有满足上界约束 $ X^2 + X \leq B $ 的整数 $ X $(记为集合 $ SB $);
✅ 再从中剔除那些严格不满足下界的 $ X $,即满足 $ X^2 + X {
✅ 最终答案即为 $ |SB \setminus S{integers_between_roots(roots),它接收二次方程 $ x^2 + x + c = 0 $ 的实数根(小根在前),返回所有落在 $ [\lceil r_1 \rceil,\ \lfloor r_2 \rfloor] $ 内的整数构成的 range(注意:range 左闭右开,故需 +1 保证包含 floor(r2)):from math import sqrt, floor, ceil
def find_quadratic_roots(a: int, b: int, c: int) -> tuple | None:
discriminant = b * b - 4 * a * c
if discriminant range:
r1, r2 = roots
return range(ceil(r1), floor(r2) + 1)
{0;values_below_A = values_below_or_at_A - set(roots_of_a)”存在严重缺陷:roots_of_a 是浮点数元组,不能直接转为 set,且即使能,减去根也无法准确剔除整数点(因根通常非整数)。正确做法是:对下界使用 $ A-1 $ 构造新不等式,即:solution 实现如下:def solution(A: int, B: int) -> int:
if A > B:
return 0
# All X such that X(X+1) X(X+1) <p>? <strong>注意事项</strong>:</p>
ceil/floor 边界偏差(如根非常接近整数时)。实际工程中建议对候选边界点 $ \lfloor r_2 \rfloor $、$ \lceil r_1 \rceil $ 做±1校验,或改用整数二分搜索避免浮点误差;solution(6, 6) → 满足 $ X(X+1)=6 $ 的整数解为 $ X=-3 $(因 $ (-3)(-2)=6 $)和 $ X=2 $(因 $ 2×3=6 $),返回 2,符合预期。










