Algorithm 找出四个和给定数相加的连续数

Algorithm 找出四个和给定数相加的连续数,algorithm,Algorithm,假设有一个给定的数字,我们应该测试它是否是四个连续数字的乘积 因此,如果y是我们给定的数字,我们应该测试y=x(x+1)(x+2)(x+3)对于任意x 如何为这个问题设计一个算法 我是这样做的: import java.util.*; public class Product { public static int product(int i) { return i * (i+1) * (i+2) * (i+3); } public sta

假设有一个给定的数字,我们应该测试它是否是四个连续数字的乘积

因此,如果
y
是我们给定的数字,我们应该测试
y=x(x+1)(x+2)(x+3)
对于任意
x

如何为这个问题设计一个算法

我是这样做的:

import java.util.*;

public class Product 
{
    public static int product(int i)
    {
         return i * (i+1) * (i+2) * (i+3);
    }

    public static void main(String[] args) 
    {
        Scanner scnr = new Scanner(System.in);
        int x = scnr.nextInt();
        for (int i = 0; i < x/2; i++)
        {
            if (product(i) == x)
            {
                System.out.println("number is product of 4 consecutive numbers");
                break;
            }
        }
    }
}
import java.util.*;
公共类产品
{
公共静态整数乘积(整数i)
{
返回i*(i+1)*(i+2)*(i+3);
}
公共静态void main(字符串[]args)
{
扫描仪scnr=新扫描仪(System.in);
int x=scnr.nextInt();
对于(int i=0;i
编辑:错误地阅读问题,但要了解问题的价值(一种快速测试问题是否是四个连续整数的乘积的方法):


四个连续整数的任何乘积都比a大。

我首先要得到“y”的第四个根。这将为您提供可以使用的y(即“x”)的最小因子的近似值。将此作为标准因式分解算法的基础。

对于许多数字,我们可以很容易地看到它们是否适合某个X:

  • Y必须能被3整除,因为至少有一个连续数字能被3整除
  • Y必须能被4整除,因为至少有一个连续数字能被4整除
所以Y必须至少能被12整除(3*4)。 这意味着你可以轻易地扔掉所有数字的92%

因为Y的值至少包含X的四次方,所以可以先取Y的四次方根(或者用英语怎么称呼它),然后将其四舍五入为整数值,称之为X,并计算X(X+1)(X+2)(X+3)的结果

结果可能会更高(因为我们忽略了其他因素,比如X的3次方,X的2次方,…)

现在从X中减去1并执行相同的计算


只要结果高于Y,重复此操作直到结果低于Y,否则您将获得Y。

您的方程式可以简化为

y = x^4 + 6*x^3 + 11*x^2 + 6x
您可以从x=1开始,然后向上检查。我们可以注意到一个非常容易计算的上界:y的第四个根(或者y的平方根的平方根)。意思是,当你达到这个数字时,你可以停下来。这对你来说是幸运的,因为对我们来说幸运的是,第四根非常小

对于10000以下的数字,这很容易检查,因为最多要检查10个整数。如果您的数字小于500,则最多只需检查四个整数

在1000000+时,您必须开始检查31个或更多的数字,因此它可能会变得不那么琐碎


上下限 经过仔细的改进,我们得出了两个结论:

  • y^0.25-1.2的更精确上界
  • y^0.25-1.5的确定下界
  • 所以

    注意,在这种情况下,对于任何给定的y,最多要检查两个数字


    编辑:在将x细化为仅整数后,在所有情况下,当范围缩小为一个数字时,似乎只有一个数字需要检查。酷!(感谢Brian)

    计算
    y
    的第四个根,将其四舍五入并称之为
    a
    <代码>a(a-1)(a-2)(a-3)远小于
    y
    。计算
    y
    的第四个根,将其四舍五入,并将其称为
    b
    <代码>b(b+1)(b+2)(b+3)远大于
    y
    。现在您可以从三个可能的数字开始:
    a-2
    a-1
    a
    (注意
    a=b
    a=b-1
    )。因此,检查
    (a-2)(a-1)a(a+1)
    (a-1)a(a+1)(a+2)
    a(a+1)(a+2)(a+3)
    就足够了

    您只需测试
    地板(y**(0.25)-1)
    。当y接近无穷大时,x接近y**0.25-1.5(从下方)

    在某种程度上,这是相当直观的
    x*(x+1)*(x+2)*(x+3)
    是四个数字的乘积,其平均值等于
    x+1.5
    。当x高时,1.5看起来很小。

    y = x(x+1)(x+2)(x+3) = x^4 + 6x^3 + 11x^2 + 6x
    
    请注意,系数看起来几乎是对称的,但末尾没有1

    所以假设

    y = z^2 - 1
    
    i、 e

    有x的所有幂的系数,直到4,x^4和x^0的幂的系数都是1,所以我们需要找到x^1的系数,我们称之为
    a

    z = (x^2 + ax + 1)^2 = x^4 + 2ax^3 + (2+a^2)x^2 + 2ax + 1
    
    比较x^1、x^2或x^3的系数得出
    a=3

    (上述方程式不要求x、y或z中的任何一个为整数,但可能会丢失我们不感兴趣的复数或负根)

    所以我们可以为
    x
    解一个二次方程:

    x^2 + 3x + 1 - sqrt(y+1) = 0
    
    给予

    如果
    sqrt(y+1)
    是一个完美的平方
    z
    (5+4z)
    也是一个完美的平方(如果
    z
    是一个整数,
    5-4z
    是奇数,那么它的平方根,如果是整数,也是奇数,
    x
    将是整数)

    所以,测试
    z=sqrt(y+1)
    是否为整数,然后测试
    5+4z
    是否为完美平方。

    答案非常简单。
    对于给定的数字y,如果y+1不是完全平方,则y不是四个连续数字的乘积。
    如果y+1是完全平方,那么y是四个连续数的乘积,当且仅当sqrt(5+4*sqrt(y+1))是整数。

    正如其他人所说,从y的第四个根开始(我们称之为z)

    在序列x,x+1,…x+3中,我们知道有些值必须小于z,有些值必须大于z(因为它们不可能都等于z)

    所以,我们知道

    x <= ceiling(z)
    x+3 >= floor(z)
    
    x=楼层(z)
    
    这给了你一个很小的范围
    x^2 + 3x + 1 - sqrt(y+1) = 0
    
    x = -3 +/- sqrt(9 - 4 * (1-sqrt(y+1))) 
        ---------------------------------
                    2
    
      = -3 +/- sqrt(5 + 4 sqrt(y+1)) 
        ----------------------------
                    2
    
    x <= ceiling(z)
    x+3 >= floor(z)