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,重复此操作直到结果低于Y,否则您将获得Y。您的方程式可以简化为
y = x^4 + 6*x^3 + 11*x^2 + 6x
您可以从x=1开始,然后向上检查。我们可以注意到一个非常容易计算的上界:y的第四个根(或者y的平方根的平方根)。意思是,当你达到这个数字时,你可以停下来。这对你来说是幸运的,因为对我们来说幸运的是,第四根非常小
对于10000以下的数字,这很容易检查,因为最多要检查10个整数。如果您的数字小于500,则最多只需检查四个整数
在1000000+时,您必须开始检查31个或更多的数字,因此它可能会变得不那么琐碎
上下限 经过仔细的改进,我们得出了两个结论:
编辑:在将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)