【问题标题】:Python program to find 5 prime numbers above and below a given integerPython程序查找给定整数上下5个素数
【发布时间】:2021-11-28 19:42:40
【问题描述】:

我在编写一个在用户输入的整数“n”上下查找 5 个素数的程序时遇到问题

注意:如果素数少于 5 个,则打印尽可能多。如果 n 本身是素数,则不应包括在内。不允许使用列表或函数

这是我应该得到的输出:

Please enter n: 20
Larger prime numbers: 23 29 31 37 41
Smaller prime numbers: 19 17 13 11 7

这是我的尝试:

n = int(input("Number: "))
# n = 20
count1 = 0
x = 2

while count1<5:
    for i in range(2, n+x):
        if (n+x) % i ==0:
            break
        else:
            print(n+x)
            count1 += 1
            break
    x +=1

【问题讨论】:

  • 当您说“不允许使用列表”时,您是什么意思?代码无法记住它发现的是素数?
  • 没错。我应该在找到质数后立即打印它
  • 在调试器中单步执行程序时会发生什么?您是否查看过输出是什么以及它与您的期望相比如何?例如,为什么它从 23 开始每隔一个数字打印一次?是一个 if-else 块,所有条件都导致break 你想要实现的目标吗?卡住是正常的,但是从 9 行代码中得到错误的输出似乎是一种情况,您可能会分享一些尝试调试的尝试。一个有用的指南是 Eric Lippert 的优秀 How to debug small programs

标签: python primes


【解决方案1】:

此代码的工作方式:

  • 在数字之后计数,直到达到五个素数
  • 在数字前倒数直到达到五个素数(停在 2)
  • 不使用任何函数或列表(除了我认为可以的模函数)

代码

n = int(input('Please enter n: '))
# Try larger numbers than n
print('Larger prime numbers:', end = ' ')
num = n + 1
cnt = 0
while True:
    for i in range(2, num-1):     # prime test
        if num % i == 0:
            break
    else:
        print(num, end = ' ')     # was prime
        cnt += 1
        if cnt == 5:
            break
    num += 1

# Try smaller numbers than n
print('\nSmaller prime numbers:', end = ' ')
cnt = 0
num = n - 1
while num > 1:
    for i in range(2, num-1):    # prime test
        if num % i == 0:
            break
    else:
        print(num, end = ' ')    # was prime
        cnt += 1
        if cnt == 5:
            break
            
    num -= 1

测试

Please enter n: 20
Larger prime numbers: 23 29 31 37 41 
Smaller prime numbers: 19 17 13 11 7 
​

【讨论】:

    【解决方案2】:

    这篇文章中的答案提供了一个极好的函数形式来测试素性(AKS 素性测试):

    How to create the most compact mapping n → isprime(n) up to a limit N?

    并且该测试不需要找到任何素数的“记忆”。

    然后的任务是对该函数进行编码,而不是使其成为实际函数。

    n = int(input("Number: "))
    M=5
    
    print(f'{M} primes below {n}: ',end='')
    itest=n-n%2-1 # number is odd, and is below input number
    nab=0
    while nab<M:
      if itest == 2:
        print(itest,end=' ')
        nab+=1
        break
      if itest == 3:
        print(itest,end=' ')
        nab+=1
        itest-=1
        continue
      if itest % 2 == 0:
        itest-=2
        continue
      if itest % 3 == 0:
        itest-=2
        continue
    
      i = 5
      w = 2
    
      ipass=True
      while i * i <= itest:
        if itest % i == 0:
          ipass=False
          break
        i += w
        w = 6 - w
      if ipass:
        print(itest,end=' ')
        nab+=1
      itest-=2
    
    print('')
    
    print(f'{M} primes above {n}: ',end='')
    itest=n+n%2+1 # number is odd, and is above input number
    nab=0
    while nab<M:
      if itest == 2:
        print(itest,end=' ')
        nab+=1
        itest+=2
        continue
      if itest == 3:
        print(itest,end=' ')
        nab+=1
        itest+=2
        continue
      if itest % 2 == 0:
        itest+=2
        continue
      if itest % 3 == 0:
        itest+=2
        continue
    
      i = 5
      w = 2
    
      ipass=True
      while i * i <= itest:
        if itest % i == 0:
          ipass=False
          break
        i += w
        w = 6 - w
      if ipass:
        print(itest,end=' ')
        nab+=1
      itest+=2
    

    例如 22 的输出是

    Number: 22
    5 primes below 22: 19 17 13 11 7
    5 primes above 22: 23 29 31 37 41
    

    还有一个例子:

    Number: 131553423669295
    5 primes below 131553423669295: 131553423669257 131553423669181 131553423669097 131553423669043 131553423668977
    5 primes above 131553423669295: 131553423669299 131553423669347 131553423669413 131553423669419 131553423669439
    

    时间测试

    对于较大的数字,此算法要快得多

    例如,针对数字 5564445 对该算法进行timeit 测试,执行 1000 次,耗时 2.66 秒。使用除以每个数字直到找到除数的简单方法需要 1 小时 40 分钟。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 1970-01-01
      • 2013-10-20
      • 2012-01-28
      • 2012-05-29
      相关资源
      最近更新 更多