首页 > 解决方案 > 编写一个程序,使用 python 打印出前 N 个 emirps,每行五个

问题描述

Emirp 是一个素数,其反转也是一个素数。例如,17 是素数,71 是素数,所以 17 和 71 是 emirps。

以下代码编译并接受输入。输入验证是正确的,但程序继续运行并且不输出任何内容。我还想知道如何在 python 中找到错误。如果有任何缩进错误,请忽略。

class negerror(UserWarning):
    pass


while True:

    prompt = input('Please enter a positive number: ')
    try:
        number=int(prompt)
        if number<=0:
            raise negerror
        break
    except ValueError:
        print('You did not enter an integer. Please try again. ')
    except negerror:
        print('You entered a negative number. Please make sure to enter a positive number')

def isPrime(value):
    count=0
    for i in range(1,value+1):
        if value%i==0:
            count=count+1
    if count<=2:
        return True
    else:
        return False


def reverse(value):
    val=str(value)
    val=val[::-1]
    val=int(val)
    return val


Test=2
countemirps=0
numberinoneline=0
while countemirps<number:
    if isPrime(Test) and isPrime(reverse(Test)):
        print('%6s'%Test, end = '  ')
        countemirps=countemirps+1
        Test=Test+1
        numberinoneline=numberinoneline+1
        if numberinoneline%5==0:
            print('\n')

标签: python

解决方案


您的isPrime功能已关闭。它计算除数的数量value并将其存储在变量中count。但是,True如果count>2False其他情况,您会返回。应该反过来:素数有两个除数,合数有两个以上。因此将测试更改为count <= 2. 更好,更 Pythonic,将该函数的最后几行替换为

return count <= 2

也许

return count == 2

你明白为什么会这样吗?

(我看到您现在已更正此错误并编辑了您的问题,但程序仍然无法运行。)


另一个错误是在你的主循环中你有测试

if isPrime(Test) and isPrime(reverse(Test)):

如果该测试通过,您打印数字并更新您的变量,包括Test--all 都很好。但是,如果测试失败,您什么也不做,特别是 的值Test不会改变。循环重复,您执行完全相同的测试,没有任何变化。程序陷入无限循环。

您可以通过将更新的行Test移出if测试并将其放在循环的末尾来解决此问题,以便在每个循环上执行。然后你的循环变成

while countemirps<number:
    if isPrime(Test) and isPrime(reverse(Test)):
        print('%6s'%Test, end = '  ')
        countemirps=countemirps+1
        numberinoneline=numberinoneline+1
        if numberinoneline%5==0:
            print('\n')
    Test=Test+1

当我现在测试你的程序时,它似乎可以工作。


可能还有其他我看不到的错误。您应该将功能isPrime与其余代码分开测试。当它运行良好时,然后测试功能reverse。然后测试你的代码部分。一次运行所有代码会使本地化和查找错误变得困难。


最后,您问“如何在 Python 中找到错误”。对于这个站点来说,这个问题太宽泛了——您应该阅读有关调试的书籍章节或教程。但简而言之,初学者有两种主要方法。首先是在你的代码中自由地放置print语句,显示程序执行的流程和你的关键变量的值。如果您放置了声明

print(Test)

在循环开始时,您会看到循环无限重复,并且 的值Test没有改变。当错误似乎消失时,您可以删除或注释掉这些print语句。记录可以更容易地做到这一点

另一种更好的方法是使用调试器。我的大部分 Python 编程都是在Spyder一个包含调试器的开发环境中完成的。我用它一次一行地执行你的程序,一个窗口Spyder显示了我的变量值。还有一些调试器可以在开发环境之外工作。我鼓励您查找、学习和使用包含调试器的集成开发环境。Spyder是一个免费的,优秀的,专门从事科学编程的。我将它用于我的数学编程。


推荐阅读