我可以有任何数字行,其中包含 2 到 10 个数字。从这一行开始,我必须得到几何级数。
例如:给定数字行:125 5 625
我必须得到答案5
。行:128 8 512
我必须得到答案4
。
你能帮我个忙吗?我不求程序,只是一个提示,我想自己看懂,自己写代码,但是该死的,我想了一天也想不通。
谢谢你。
不要编写整个程序!
伙计们,你不明白,我不能简单地划分。我实际上必须得到几何级数+显示所有数字。在行中128 8 512
,所有数字将是:8 32 128 512
赛斯的答案是正确的。我将这个答案留在这里,以帮助详细说明为什么答案128 8 512
是4
因为人们似乎对此有问题。
几何级数的元素可以写成你正在寻找的数字(c*b^n
也必须大于 1),是一个常数并且是一些任意数字。b
b
c
n
所以最好的办法是从最小的数字开始,分解它并查看所有可能的解决方案,将它写在c*b^n
表格中,然后b
在剩余的数字上使用它。返回有效的最大结果。
所以对于你的例子:
125 5 625
从 5 开始。5 是素数,所以它只能写成一种方式:5 = 1*5^1
. 所以你b
是 5。你现在可以停下来,假设你知道该行实际上是几何的。如果您需要确定它是否是几何图形,b
请在剩余的数字上进行测试。
128 8 512
8
可以写成不止一种方式:8 = 1*8^1
, 8 = 2*2^2
, 8 = 2*4^1
, 8 = 4*2^1
. 所以你有三个可能的值b
,还有几个不同的选项c
。先尝试最大的。8
不起作用。试试4
。有用!128 = 2*4^3
和512 = 2*4^4
。b
也是如此。4
_ c
_2
3 15 375
这个有点意思,因为第一个数字是素数但不是b
,它是c
。因此,您需要确保如果您的第一个b
-candidate 不适用于剩余的数字,您必须查看下一个最小的数字并将其分解。所以在这里你会分解 15: 15 = 15*?^0
(退化的情况), 15 = 3*5^1
, 15 = 5*3^1
, 15 = 1*15^1
. 答案是 5 和3 = 3*5^0
,所以它成功了。
编辑:我认为这现在应该是正确的。
该算法不依赖于因式分解,仅依赖于欧几里得算法及其紧密变体。这使得它在数学上比使用因式分解的解决方案稍微复杂一些,但它会快得多。如果您了解欧几里得算法和对数,那么数学应该不是问题。
(1) 对数字集进行排序。你有表格的数字ab^{n1} < .. < ab^{nk}
。
例子:(3 * 2, 3*2^5, 3*2^7, 3*2^13)
(2) 形成一个新列表,其排序列表的第 (n+1) 个元素的第 n 个元素除以第 (n) 个。你现在有b^{n2 - n1}, b^{n3 - n2}, ..., b^{nk - n(k-1)}
.
(续)示例:(2^4, 2^2, 2^6)
定义d_i = n_(i+1) - n_i
(不要编程——即使你想也不能,因为n_i
未知——这只是为了解释程序是如何工作的)。
(续)示例:d_1 = 4, d_2 = 2, d_3 = 6
请注意,在我们的示例问题中,我们可以自由选择(a = 3, b = 2)
或(a = 3/2, b = 4)
。底线是b
从步骤(2)中划分列表中所有条目的“真实”的任何幂是正确的答案。因此,我们可以提高b
到任何除以所有的幂d_i
(在这种情况下,任何除以 4、2 和 6 的幂)。问题是我们既不知道b
也不知道d_i
。但是如果我们让m = gcd(d_1, ... d_(k-1))
,那么我们可以找到b^m
,这就足够了。
注意:给定b^i
and b^j
,我们可以找到b^gcd(i, j)
使用:
log(b^i) / log(b^j) = (i log b) / (j log b) = i/j
这允许我们使用欧几里得算法的修改版本来查找b^gcd(i, j)
. “动作”全部在指数中:加法已被乘法,乘以幂,以及(因此)商与对数代替:
import math
def power_remainder(a, b):
q = int(math.log(a) / math.log(b))
return a / (b ** q)
def power_gcd(a, b):
while b != 1:
a, b = b, power_remainder(a, b)
return a
(3) 由于原始集合的所有元素的幂不同r = b^gcd(d_1, ..., d_(k-1))
,因此它们都是cr^n
所需的形式。但是,c
可能不是整数。让我知道这是否有问题。
最简单的方法是分解数字并找到它们共有的最大数字。但要小心,因式分解具有指数级的复杂性,因此如果您在行中获得大量数字,它可能会停止工作。
你想要的是知道连续所有数字的最大公约数。
一种方法是检查它们是否都可以除以行中较小的数字。
如果没有,请尝试该行中较小数字的一半。
然后继续往下走,直到找到一个将它们整除或除数等于 1 的数字。
Seth 答案不正确,应用该解决方案不能解决128 8 2048
行,例如 (2*4^x),你得到:
8 128 2048
=>
16 16
=>
GCD = 16
确实,解决方案是此结果的一个因素,但您需要将其分解并一一检查正确答案是什么,在这种情况下,您需要以相反的顺序检查解决方案因素,16, 8, 4, 2
直到您看到 4 个匹配所有条件。