我最近在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],这是正确的。
我已经仔细检查了我的代码和算法几个小时,但我仍然无法弄清楚为什么我没有通过测试用例,任何人都可以帮我解决我的困境???等待回复。
答案 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