算法:对整数X进行分解以获得尽可能多的不同正整数(Y1 ... Yk),以便(Y1 + 1)(Y2 + 1)......(Yk + 1)= X

时间:2017-10-09 20:50:35

标签: python algorithm python-3.x prime-factoring factorization

我最近在open.kattis.com上遇到了一个算法问题。 问题的链接是https://open.kattis.com/problems/listgame2。 基本上,问题是要求玩家将整数X(10 ^ 3 <= X <= 10 ^ 15)分解以获得尽可能多的不同正整数(Y 1 < / sub>,...,Y k )尽可能使(Y 1 +1)(Y 2 +1)⋯( Y k +1)= X。

我已经提出了一个使用Python3的解决方案,它确实传递了几个测试用例,但却失败了其中一个:MyStatus

我的代码是:

def minFactor(n, start):
    maxFactor = round(n**0.5)
    for i in range(start, maxFactor+1):
        if n % i == 0:
            return i
    return n

def distinctFactors(n):
    curMaxFactor = 1
    factors = []

    while n > 1:
        curMaxFactor = minFactor(n, curMaxFactor+1)
        n //= curMaxFactor
        factors.append(curMaxFactor)

    # This is for the situation where the given number is the square of a prime number
    # For example, when the input is 4, the returned factors would be [2,2] instead of [4]
    # The if statement below are used to fix this flaw
    # And since the question only requires the length of the result, deleting the last factor when repeat do works in my opinion
    if factors[-1] in factors[:-1]:
        del factors[-1]

    return factors

num = int(input())
print(len(distinctFactors(num)))

具体来说,我在上面代码中的想法非常简单。例如,当给定输入为36时,我运行minFactor函数以发现最小因子36为2(在这种情况下忽略1)。然后,我通过36/2得到18并且调用minFactor(18,3),因为2不再明显,所以我开始找到最小因子18乘以3.它明显是3,所以我得到6做18 / 3在函数distinctFactors中并调用minFactor(6,4),因为4小于sqrt(6)或6 ** 0.5所以6本身将被返回并且我最终得到列表因子为[2,3,6],这是正确的。

我已经仔细检查了我的代码和算法几个小时,但我仍然无法弄清楚为什么我没有通过测试用例,任何人都可以帮我解决我的困境???等待回复。

1 个答案:

答案 0 :(得分:1)

考虑号码2**6.11**5

您的算法将找到5个因素:

2
2**2
2**3
11
11**2
(11**2 this will be discarded as it is a repeat)

6长的答案是:

2
2**2
11
11**2
2*11
2**2*11