for循环出错。 (找到三个整数)

时间:2014-01-15 08:24:34

标签: python for-loop

所以,我们的老师给了我们一个任务,找到三个整数a,b c。它们使用Python在0到450之间。

如果b是偶数,则

a = c + 11 如果b为奇数,a = 2c-129

b = ac mod 2377

c =(Σ(b-7k)从k = 0也是a-1)+142(编辑。我写错了。是-149)

我厌倦了看起来像这样的代码:(还是一个新手。我猜我的很多代码都错了)

for a, b, c in range(0, 450):
    if b % 2 == 0:
        a = c + 11
    else:
        a = 2 * c - 129
    b = (a * c) % 2377
    c = sum(b - 7 * k for k in range(0, a - 1))

但是我收到了错误:

for a, b, c in range(0, 450):
TypeError: 'int' object is not iterable

我做错了什么,如何检查0到450之间的每个数字?

6 个答案:

答案 0 :(得分:3)

import itertools

for b, c in itertools.product(*[range(450)]*2):
    if b % 2 == 0:
        a = c + 11
    else:
        a = 2 * c - 129
    derived_b = (a * c) % 2377
    derived_c = sum(b - 7 * k for k in range(0, a - 1))

    if derived_b == b and derived_c == c:
        print a, b, c

答案 1 :(得分:3)

Nick T和Eric的答案希望通过迭代abc的值来帮助您解决问题。我还想指出,你接近这个问题的方式是行不通的。如果你要在循环的每次迭代中将a重新分配给某个东西,那么迭代a的各种值有什么意义呢?同样适用于bc。更好的方法是检查任何给定的三元组(a, b, c) 满足赋值中给出的条件。例如:

from itertools import product, tee

def test(a, b, c):
    flags = {'a': False,
             'b': False,
             'c': False}
    if (b % 2 == 0 and a == c+11) or (b % 2 == 1 and a == 2*c-129):
        flags['a'] = True
    if b == (a * c) % 2377:
        flags['b'] = True
    if c == sum(b - 7*k for k in range(a-1)) - 149:
        flags['c'] = True
    return all(flags.values()) # True if zero flags are False

def run_tests():
    # iterate over all combinations of a=0..450, b=0..450, c=0..450
    for a, b, c in product(*tee(range(451), 3)):
        if test(a, b, c):
            return (a, b, c)

print(run_tests())

注意:这是一个缓慢的解决方案。在glglgl的答案或Duncan的评论中,做出较少循环的一个显然是有利的。这实际上更多用于说明目的。

答案 2 :(得分:2)

你需要将循环嵌套到暴力强制中,就像你正在尝试一样:

for a in range(451): # range(450) excludes 450
    for b in range(451):
        for c in range(451):
            ...

非常明显是O(n 3 ),但如果你想要一个快速而肮脏的答案,我想它只能工作9100万个循环,最坏的情况。

答案 3 :(得分:1)

[0,450]的东西只是一个提示。

事实上,你的变量是耦合在一起的。您可以立即直接消除至少一个循环:

for b in range(0, 451):
    for c in range(0, 451):
        if b % 2: # odd
            a = 2 * c - 129
        else:
            a = c + 11
        if b != (a * c) % 2377: continue # test failed
        if c != sum(b - 7 * k for k in range(a)): continue # test failed as well
        print a, b, c

应该做的。

答案 4 :(得分:0)

我不会发布完整的代码(毕竟,这是作业),但你可以消除两个外部循环。如果您遍历c,这是最简单的。

您的代码应该类似于:

 for c in range(451):
     # calculate a assuming b is even
     # calculate b
     # if b is even and a and b are in range:
        # calculate what c should be and compare against what it is
     # calculate a assuming b is odd
     # calculate b
     # if b is odd and a and b are in range:
        # calculate what c should be and compare against what it is

用于消除重复代码以计算c

的额外信用

答案 5 :(得分:0)

a = c + 11 if b is even
a = 2c-129 if b is odd
b = ac mod 2377

c = (∑(b-7k) from k = 0 to a-1) +142

这为你提供了所有3个数字之间的强关系

给定值a,有2个值ca-11(a+129)/2),它们又为b(ac mod 2377提供2个值c的两个值都以b)的结果的奇怪性为条件,而后者又被用于验证c的公式中。

由于计算c的公式,其总体复杂度为o(n ^ 2)。

这是一个实现示例:

for a in xrange(451):
    c_even = a - 11
    b = (a*c_even) % 2377
    if b % 2 == 0:
        c = sum(b - 7 * k for k in range(a)) + 142
        if c == c_even:
            print (a, b, c)
            break
    c_odd = (a+129)/2
    b = (a*c_odd) % 2377
    if b % 2 == 1:
        c = sum(b - 7 * k for k in range(a)) + 142
        if c == c_odd:
            print (a, b, c)
            break