描述

输入一个正整数n,统计从[0,n]之间的最大的10个素数之和。本题保证测试用例至少有10个满足条件的素数。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
例如:输入31 ,应求得3,5,7,11,13,17,19,23,29,31之和。
题目要求定义两个函数分别用于判断素数和求和,判断素数的函数前面应该有较多的应用了:

  1. def isPrime(n): # 判断素数的函数,可以接受任意整数输入,实际上本题可以不判定2以下的数字
  2. if n < 2: # 0和1不是素数
  3. return False
  4. for i in range(2, n):
  5. if n % i == 0:
  6. return False
  7. else:
  8. return True

因题目确保测试用例至少有10个满足条件的素数,所以if n < 2可以省略。为提高素数判断的效率,可以缩小判定区间:

  1. def isPrime(n): # 判断素数的函数,可以接受任意整数输入,实际上本题可以不判定2以下的数字
  2. for i in range(2, int(n ** 0.5) + 1): # 保证效率,for i in range(2, n)
  3. if n % i == 0:
  4. return False
  5. else:
  6. return True

累加函数这里有两种方法:
一种是找到所有小于或等于 n 的素数,加入到列表里,再用切片的方法取出最后加入的10个素数。因为这种方法要判断所有的数是不是素数,但数字规模较大时,计算量非常大,而且列表因存储方面的设计,效率也不高,所以一般不建议这样的方法。

  1. def f(n):
  2. ls = []
  3. for i in range(2, n + 1):
  4. if isprime(i):
  5. ls.append(i) # 将判定为素数的数加入列表
  6. return sum(ls[-10:]) # 返回列表中最大的10个元素的和

另一种是用 range(n,1,-1) 产生倒序的数列,由大到小去判定素数,找到一个累加一个,这样可以减少很多无意义的素数的判定,也避免应用列表存储数据,可以极大的提升效率。应用这种方式时,要对找到的素数进行计数,达到10个后就直接 用 return 返回累加值。也可以先用break提前终止循环,再返回累加值。

  1. def f(n):
  2. sumPrime,count=0,0
  3. for i in range(n,1,-1):
  4. if isprime(i):
  5. sumPrime = sumPrime + i
  6. count = count + 1
  7. if count == 10:
  8. return sumPrime

完整参考代码如下:

  1. def isprime(n):
  2. for i in range(2,int(n**0.5)+1): # 第一个影响效率的语句
  3. if n%i==0:
  4. return False
  5. else:
  6. return True
  7. def f(n):
  8. sumPrime,count=0,0
  9. for i in range(n,1,-1): # 第二个影响效率的语句
  10. if isprime(i):
  11. sumPrime = sumPrime + i
  12. count = count + 1
  13. if count == 10:
  14. return sumPrime
  15. num = int(input())
  16. print(f(num))

还可以考虑判定输入是否为偶数,然后直接产生奇数的数列,进一步减少素数的判定。此时要注意考虑10个素数中是否会包含2。