繁体   English   中英

用两个连续因子计算给定区间内的整数个数

[英]Count number of integers in a given interval with two consecutive factors

我正在尝试解决这个问题,该问题要求在给定间隔内找到具有连续因子 x(x+1) 的整数个数。 2 = 1 * 2、6 = 2 * 3 等等,

要找到可以分解为连续整数的数字的计数,这是我写的 function,它取范围内的每个正 integer 并将其平方根两侧的整数相乘以确定它是否可以分解为两个连续整数.

我想知道是否可以使用此解决方案进行任何进一步的优化。

public int solve(int a, int b) {
    int count = 0;
    for (int i = a; i <= b; i++) {
        if (i > 0) {
            int sqrt = (int) Math.floor(Math.sqrt(i));
            if (sqrt * (sqrt + 1) == i) {
                count++;
            }
        }
    }
    return count;
}

根据您的解决方案,您需要计算两倍三角数的值。

我们可以为不超过某个n的此类值的数量编写表达式

x * (x+1) <=n
x^2 + x - n <= 0

求解二次不等式并取最大x值:

Discriminant = 1 + 4 * n
x1, x2 = (-1 +- sqrt(Discriminant)) / 2
we need positive root
xmax = (-1 + sqrt(Discriminant)) / 2

现在我们将这些值计算到b (包括)和a (不计算a )并得到差异。

示例:F(100) = 9, F(11) = 2,因此对于范围 12..100,我们有 9-2=7 个值 (12,20,30,42,56,72,90)

在 Python(无特定语言)中:

from math import sqrt, floor
def conseq(a, b):
    return floor((sqrt(1 + 4 * b) - 1) / 2) - floor((sqrt(4 * a - 3) - 1) / 2)

也许我们可能会因为浮点数学不确定性而错过一些值(当 d.999999999999999 的地板给出 d 而不是 d+1 时),因此值得进行额外检查:

xb = floor((sqrt(1 + 4 * b) - 1) / 2)
if (xb+1)*(xb+2)== b:
    xb += 1
xa = floor((sqrt(4 * a - 3) - 1) / 2)
if (xa+1)*(xa+2) == a - 1:
    xa += 1
return xb - xa

首先,您的解决方案似乎不正确,条件i > 0是我能发现的第一个原因。 问题应该是找到自然数,否则你不应该排除负整数。 a = -6 and b = 9为例。 然后 -3 x -2 = 6 确实在 -6 到 9 的区间内。

但是考虑到您想要自然而不是整数,那么是的,您可以通过在a(int) Math.floor(Math.sqrt(b))之间迭代来进一步优化代码。 由于乘法的结果将大于b ,因此没有意义

希望这足以让您继续前进。 我的回答只是一个建议,我没有实现并编写单元测试来检查它。 在真正的实现中,您应该这样做。

对于整数,它会更复杂一些。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM