首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python中迭代丢番图方程的列表

在python中迭代丢番图方程的列表
EN

Stack Overflow用户
提问于 2013-05-03 12:10:43
回答 1查看 892关注 0票数 3

我在自学MIT Open Courseware Introduction to Computer Science and ProgrammingProblem Set 2涉及基于对鸡块盒子(6、9或20)的总和进行计数的丢番图方程。

我想创建一个算法的方式就像创建一个虚拟的测量棒(就像在木工作坊中),测量的尺寸(值)被记录在棒上,然后转移到另一块上。

如果我想象它被用在一条数字线上,它会指出初始值,我会标记这些点,然后,我会把零点移到它遇到的第一个标记上,做新的标记,然后重复这一点,总是往前走。

所以,取一个求和的公式:x=0a=x+6b=x+9c=x+20,每个都被附加到一个列表中,现在看起来像这样:[6,9,20]。然后,我想要做的是,让x切换到列表中的下一个最大值,为其他变量创建新值,这些值也附加到列表中。x的下一个值将是6,更改其他变量并生成如下列表:[6,9,20,12,15,26]。然后是9,等等。

我的第一个问题是重复和列表的顺序导致无限循环。我通过添加一行代码来更正这一点,该代码行创建了一组列表,这些列表再次变成了列表。这在很大程度上是有效的。

但是,这就是问题所在,它没有用所有可能的值填充列表。例如,它不会将48放入列表中,这是6的明显倍数。

我的猜测是,我的问题与我正在迭代一个不断被编辑和/或追加的列表有关。

我知道有一些算法我可以用来重新设计作业,因为我做了研究,甚至看到别人是如何对这个问题的答案进行编码的,我现在理解了这一点,但我仍然想用自己的方式来编写一个解决问题的方案。到目前为止,我的代码如下:

代码语言:javascript
复制
## Name some initial variables in diophantine equations
x=0
a, b, c= x+6, x+9, x+20

## Create a list to catch values, aka fish
fish = [a,b,c]
## Here goes
while x <= 60:
    for i in fish:
        x = i
        fish = list(sorted(fish))
        a, b, c= x+6, x+9, x+20
        ## option to see what its doing
        print x,a,b,c
        ## catch the values into the list
        fish.append(a)
        fish.append(b)
        fish.append(c)
        ## get rid of duplicate numbers in the list
        fish = list(set(fish))
        a, b, c= x+6, x+9, x+20


else:
    print fish
## Create new list of values NOT caught by the equation

lastMissingFish = list(set(range(0,50))-set(fish))

## Print the last number not reached by the equation
print lastMissingFish [-1]
EN

回答 1

Stack Overflow用户

发布于 2013-05-03 12:26:11

修改您正在迭代的同一集合几乎总是不是一个好主意,因为迭代期望底层集合不会被修改。特别是,在Python语言中对列表进行迭代,同时修改它,似乎会产生have...quirky结果。尝试将其更改为显式索引列表并增加索引,如下所示:

代码语言:javascript
复制
## Create a list to catch values, aka fish
fish = [0]
## Here goes
x, i = 0, 0
while x <= 60 and i < len(fish):
        x = fish[i]
        a, b, c = x+6, x+9, x+20
        ## catch the values into the list
        fish.append(a)
        fish.append(b)
        fish.append(c)
        ## get rid of duplicate numbers in the list.
        fish = sorted(set(fish))
        i = i + 1

作为参考,以下是我将如何解决它。我们想要添加到集合中的所有数字都可以表示为6的倍数+9的倍数+ 20的倍数。因此,让我们迭代所有这些数字,然后在集合中创建一个列表,其中所有元素都小于或等于max:

代码语言:javascript
复制
def solvechickenboxes(max, x, y, z):

    sums = set()

    for a in range((max/x)+1):
        for b in range((max/y)+1):
            for c in range ((max/z)+1):
                sums.add(a*x + b*y + c*z)

    return [x for x in sums if x <= max]

solvechickenboxes(50, 6, 9, 20)

[0, 6, 9, 12, 15, 18, 20, 21, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38, 39, 40, 41
, 42, 44, 45, 46, 47, 48, 49, 50]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16351453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档