我可以有任意数字行,包含2到10个数字。从这一行开始,我必须得到几何级数。
例如:
给定行号:125 5 625
我必须得到答案5
。行:128 8 512
我必须得到答案4
。
谢谢。
不要写整个程序!
伙计们,你们没有得到它,我不能简单地分裂。我实际上必须获得几何级数+显示所有数字。在128 8 512
行中,所有数字都是:8 32 128 512
答案 0 :(得分:4)
Seth's answer是正确的。我在这里留下这个答案,以帮助详细说明为什么128 8 512
的答案是4
,因为人们似乎遇到了麻烦。
几何级数的元素可以用c*b^n
形式书写,其中b
是您要查找的数字(b
也必须大于1),{{1} }是一个常数,c
是一些arbritrary数字。
所以最好的选择是从最小的数字开始,对其进行分解并查看所有可能的解决方案,以n
形式编写,然后在剩余数字上使用c*b^n
。返回有效的最大结果。
所以对于你的例子:
b
从5开始是5,所以它只能用一种方式编写:125 5 625
。所以你的5 = 1*5^1
是5.你现在可以停下来,假设你知道这行实际上是几何的。如果你需要确定它是否是几何的,那么在剩下的数字上测试b
。
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
- 候选人不能处理其余数字,您必须查看下一个最小数字并对其进行分解。所以在这里你要分解15:b
(简并案例),15 = 15*?^0
,15 = 3*5^1
,15 = 5*3^1
。答案是5,15 = 1*15^1
,所以它可以解决。
答案 1 :(得分:2)
编辑:我认为现在应该是正确的。
该算法不依赖于因子分解,仅依赖于欧几里得算法及其近似变量。这使得它在数学上比使用因子分解的解决方案稍微复杂一些,但它会更快。如果你理解欧几里德算法和对数,那么数学就不应该成为问题。
(1)对数字组进行排序。您的数字为ab^{n1} < .. < ab^{nk}
。
示例:(3 * 2, 3*2^5, 3*2^7, 3*2^13)
(2)形成一个新列表,其中排序列表的第(n + 1)st个元素的第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
和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
可能不是整数。如果这是一个问题,请告诉我。
答案 2 :(得分:0)
最简单的方法是将数字分解并找到它们共有的最大数字。但要小心,因子分解具有指数级的复杂性,因此如果你在行中获得大数字,它可能会停止工作。
答案 3 :(得分:0)
你想要的是知道连续所有数字的最大公约数。
一种方法是检查它们是否可以除以行中较小的数字。
如果没有,请尝试行中较小数字的一半。
然后继续往下走,直到找到一个将它们全部分开或你的除数等于1的数字。
答案 4 :(得分:0)
Seth Answer不正确,例如,在解决方案不解决128 8 2048
行的情况下(2 * 4 ^ x),您得到:
8 128 2048
=&gt;
16 16
=&gt;
GCD = 16
确实,解决方案是此结果的一个因素,但您需要对其进行分解并逐个检查正确答案是什么,在这种情况下,您需要以相反的顺序检查解决方案因素{{1直到你看到4个匹配所有条件。