所以,我们的老师给了我们一个任务,找到三个整数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之间的每个数字?
答案 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的答案希望通过迭代a
,b
和c
的值来帮助您解决问题。我还想指出,你接近这个问题的方式是行不通的。如果你要在循环的每次迭代中将a
重新分配给某个东西,那么迭代a
的各种值有什么意义呢?同样适用于b
和c
。更好的方法是检查任何给定的三元组(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个值c
(a-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