在考试时,我必须编写能够给出该问题答案的算法:
"在 numbers.txt 文件中,有500个数字用新行分隔。找到最大公约数大于1的最长数字串。换句话说,存在一个数字,它们都是它们的除数。 作为答案,给出字符串中第一个数字的值,字符串的长度以及它们的GCD数。"
我的第一个想法是不太理想。我没有写它,但概念是这样的:
#AARRGGBB
之后我会找到最长的字符串。
说实话,我现在没有更好的主意。我会感激任何帮助:)
答案 0 :(得分:3)
使用500个数字,您可以使用O(n ^ 2)gcd计算来强制执行此操作。
对于每个起始点,尝试增加字符串的长度,直到gcd等于1.
请注意,gcd(a,b,c)等于gcd(gcd(a,b),c),因此每次迭代循环只需要额外的gcd计算。
A=[3,7,21,6,9,10]
from fractions import gcd
best = ''
for start,g in enumerate(A):
length = 1
for x in A[start:]:
g = gcd(g,x)
if g==1:
break
if length>len(best):
best = A[start:start+length]
length += 1
print best
打印:
[21, 6, 9]
答案 1 :(得分:0)
如果复杂性很重要,您可以先尝试分解您的数字。然后对于前一个数字的每个素数除数,尝试延长'序列。如果数字有一些共同的除数,那么共同的除数就是一个素数,特别是。而且,不同素数的除数很小:
http://math.stackexchange.com/questions/409675/number-of-distinct-prime-factors-omegan
换句话说,算法是动态的。保留值列表(素数除数,max_length)。如果下一个数字可以被p整除,那么增加p的max_length,否则将其设置为1.容易分解是在平方根时间,或者你可以先使用欧几里得筛。