0

我是一名初学者程序员,我决定编写一个简单的程序,从数字中获取素数然后打印它们,但我在打印最终结果时遇到了麻烦。这是代码:

n = int(raw_input("Number?: "))
m = n
k = 2
czynniki = []       

while(m != 1):
    if m%k == 0:
        czynniki.append(k)
        print m, "\t", '|', k
        m = m/k
    else:
        k+=1
print m

print n, ' = ',
for czynnik in czynniki:
    if czynniki.count(czynnik)>1:
        print czynnik, '^', czynniki.count(czynnik), ' *',
        czynniki = filter(lambda x: x!=czynnik, czynniki)
    else:
        print czynnik, ' *',

一切都很好,直到最后。例如,我希望它在输入 1025 时打印“1025 = 5^2 * 41”,但它会打印“1025 = 5^2 * 5 * 41”,就好像过滤功能根本没有影响一样。错误在哪里?

4

3 回答 3

2

问题是您czynniki在迭代列表时正在修改列表。试试这个:

print n, ' = ',
for czynnik in sorted(set(czynniki)):
    if czynniki.count(czynnik)>1:
        print czynnik, '^', czynniki.count(czynnik), '*',
    else:
        print czynnik, '*',

在这里,您遍历列表中唯一唯一项目的单独列表czynniki。这是通过将列表转换为一组(唯一项目的未排序列表)然后返回到排序列表来实现的。

如果你想在最后摆脱多余*的,你可以试试这个:

result_list = []
for czynnik in sorted(set(czynniki)):
    if czynniki.count(czynnik)>1:
        result_list.append(str(czynnik) + '^' + str(czynniki.count(czynnik)))
    else:
        result_list.append(str(czynnik))
print n, '=', ' * '.join(result_list)
于 2012-09-08T11:24:44.267 回答
1

您正在对for存储在 中的列表开始循环,czynniki稍后您将更改哪些czynniki引用(一个全新的列表)不会更改for循环所经过的列表。更改循环运行的实际列表也不安全,因此无论哪种方式都不能真正做到这一点。

您可能想像这样重写循环,只是跳过重复的值,而不是在运行时尝试更改循环;

var lastvalue = -1;
for czynnik in czynniki:
    if lastvalue == czynnik:
        continue
    if czynniki.count(czynnik)>1:
        print czynnik, '^', czynniki.count(czynnik), ' *',
        lastvalue = czynnik
    else:
        print czynnik, ' *',
于 2012-09-08T11:18:15.197 回答
0

如果您想跳过循环中的某些项目而不是过滤您尝试遍历的集合,则应该使用 continue 关键字。

于 2012-09-08T11:11:28.460 回答