寻找有关此“循环”工作原理的说明

时间:2018-09-05 13:22:37

标签: python for-loop

我是编程的完整入门者,请原谅我的天真。

我想用Python编写一个程序,使我可以打印给定数量的N个质数,其中N由用户输入。我在“ for / while”循环中进行了一些搜索,并进行了一些修补。我运行了一个在网上看到的程序,并对其进行了修改以适合该问题。这是代码:

i = 1

print("Hi! Let's print the first N prime numbers.")
nPrimes = int(input("Enter your N: "))

counter =  0

while True:
    c = 0 #another initialization
    for x in range (1, (i + 1)):
        a = i % x # "a" is a new variable that got introduced.
        if a == 0:
            c = c + 1
    if c == 2:
        print(i, end = "  ")
        counter = counter + 1
        if counter > = nPrimes: #if it reaches the number input, the loop will end.
            break
    i = i+1

print(":  Are your", nPrimes, "prime number/s!")
print()
print("Thanks for trying!")

这应该能够打印用户喜欢的素数数量。这是一个有效的代码,尽管我很难理解它。看来变量c对于决定是否打印变量i很重要(在我们的例子中,变量c + 1是该间隔期间的素数)。

每次变量ca中有0的余数时,我们都会对a = i % x进行c。然后,如果i达到2,则打印当前变量c,一旦找到并打印了质数,变量i便将自身重新初始化为0。

我可以理解,但是一旦c == 2的值达到4或更高时,我就会感到困惑。 *当程序中有2个以上的因子使其余数等于零时,如何跳过4而不打印? N是否不等于4并因此打印4? *程序将如何继续下一个数字5? (鉴于变量{{1}}是足够大的输入)。

任何澄清将不胜感激。非常感谢!

2 个答案:

答案 0 :(得分:0)

在这种情况下,

c用于计算均分为i的数字的数量。

例如,如果i = 8:8被1、2、4和8整除,那么c = 4因为有4个事物被均匀地分成了

如果i = 5:5被1和5整除,所以c = 2因为有2个数字被均分

如果i = 4(您似乎很困惑):4被1、2和4整除,那么c = 3而不是2。

答案 1 :(得分:0)

Wikipedia我们知道:

  

素数(或素数)是大于1的自然数,不能通过将两个较小的自然数相乘而形成。

因此要找到素数,就是要找到一个自然数,也就是一个整数,只能将其精确除以或将其自身除以1。这称为定义方法以查找素数。

因此,以下循环遍历从1到i的所有整数, 并计算整数i被它们精确除的次数。

for x in range (1, (i + 1)):
    a = i % x # "a" is a new variable that got introduced.
    if a == 0:
        c = c + 1

然后,您判断整数i是否只能被1及其本身精确除。 如果为真,那么您算是素数了; 否则,请继续前进。

if c == 2:
    print(i, end = "  ")
    counter = counter + 1
    if counter > = nPrimes: #if it reaches the number input, the loop will end.
        break

与此同时,您可以通过在开始时将i = 1更改为i = 2并添加一条if语句,来对此主要搜索算法进行一些改进:

# Start from 2 instead of 1
# and end at `i - 1` instead of `i`
for x in range (2, i):
    a = i % x # "a" is a new variable that got introduced.
    if a == 0:
        c = c + 1

    # Abandon the loop
    # because an integer with factors other than 1 and itself
    # is unevitably a composite number, not a prime
    if c > 0:
        break

if c == 0:
    print(i, end = "  ")
    counter = counter + 1
    if counter >= nPrimes: #if it reaches the number input, the loop will end.
        break

这种改进提高了程序的效率,因为避免了不必要和毫无意义的工作。


为防止while表达式引起的潜在无限循环, 您应将while True:替换为while counter < nPrimes:。代码原来是这样的:

#if it reaches the number input, the loop will end.
while counter < nPrimes:
    c = 0 #another initialization

    # Start from 2 instead of 1
    # and end at `i - 1` instead of `i`
    for x in range (2, i):
        a = i % x # "a" is a new variable that got introduced.
        if a == 0:
            c = c + 1

        # Abandon the loop
        # because an integer with factors other than 1 and itself
        # is unevitably a composite number, not a prime
        if c > 0:
            break

    if c == 0:
        print(i, end = "  ")
        counter = counter + 1

    i = i + 1

如果您想了解更多有关如何提高程序查找质数的效率的信息,请阅读this code in C language。 :P