Python逻辑 - 欧拉62

时间:2016-01-22 20:55:21

标签: python logic

我正在尝试通过解决projecteuler.net的问题来学习python。我一直试图解决问题62,但我找不到我错的地方。因此问题表明:

The cube, 41063625 (345^3), can be permuted to produce two other cubes: 56623104 (384^3) and 66430125 (405^3). 
In fact, 41063625 is the smallest cube which has exactly three permutations of its digits which are also cube.
Find the smallest cube for which exactly five permutations of its digits are cube.

我解决这个问题的逻辑:
- 生成最多10000个立方体并将它们存储在一组中 - 对于集合中的每个多维数据集(从最大值开始),找到可以使用数字中的数字形成的最大数字。如果两个立方体具有相同的数字,它们将形成相同的最大数字 - 将这些最大数字存储在另一组中。如果最大数量已经在该组中,则递增与该最大数量对应的计数器 - 如果计数器为5,则停止。

这是我为实现上述逻辑而编写的代码。它给出了140283769536的答案,但这不是正确的答案。我哪里错了?

def maxperm(number):
    maxnum=0
    digits=[0 for x in range(10)]
    while number>0:
        digits[number%10]+=1
        number/=10
    numdigits=sum(digits)
    for i in range(9,-1,-1):
        if digits[i]>0:
            for x in range(digits[i]):
                numdigits-=1
                maxnum+=i*10**numdigits
    return maxnum

uniquecubes=dict()
cubes=[x**3 for x in range(10000)]
cubeset=set(cubes)
maxperms=set()

for i in reversed(cubes):
    a=maxperm(i)
    if a in maxperms:
        uniquecubes[a]+=1
        if uniquecubes[a]==5:
            print i
            break
    else:
        uniquecubes[a]=1
        maxperms.add(a)

1 个答案:

答案 0 :(得分:0)

该算法旨在查找是否存在5个最小排列,这些排列也是多维数据集,这不是问题所在。

解决方案1:修改算法以检查是否存在第6个,如果存在,则删除答案并继续查看。

解决方案2(首选):拥有一个带有立方体的函数permCheck(),创建该立方体数字的每个排列,并返回其中多少个排列也是多维数据集。一旦你有了:

int i = 1
while True:
    if permCheck(i*i*i) == 5:
        break
    i += 1
return i*i*i  # i^3 is now the answer