算法 - 找到最长的字符串

时间:2017-04-11 20:29:32

标签: algorithm

在考试时,我必须编写能够给出该问题答案的算法:

"在 numbers.txt 文件中,有500个数字用新行分隔。找到最大公约数大于1的最长数字串。换句话说,存在一个数字,它们都是它们的除数。 作为答案,给出字符串中第一个数字的值,字符串的长度以及它们的GCD数。"

我的第一个想法是不太理想。我没有写它,但概念是这样的:

#AARRGGBB

之后我会找到最长的字符串。

说实话,我现在没有更好的主意。我会感激任何帮助:)

2 个答案:

答案 0 :(得分:3)

使用500个数字,您可以使用O(n ^ 2)gcd计算来强制执行此操作。

对于每个起始点,尝试增加字符串的长度,直到gcd等于1.

请注意,gcd(a,b,c)等于gcd(gcd(a,b),c),因此每次迭代循环只需要额外的gcd计算。

Python代码示例

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.容易分解是在平方根时间,或者你可以先使用欧几里得筛。