鱼C论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: 冬雪雪冬

[技术交流] 小练习:20160418 计算两百万以下所有质数的和

[复制链接]
发表于 2016-4-24 12:25:58 | 显示全部楼层
  1. import math
  2. def prime_sum(n):
  3.     list_prime = [2]
  4.     def next_prime():
  5.         length = len(list_prime)
  6.         temp = list_prime[length-1]
  7.         while  True:
  8.             temp += 1
  9.             flag = 1
  10.             for i in range(length):
  11.                 if list_prime[i] <= math.sqrt(temp):
  12.                     if temp%list_prime[i] != 0:
  13.                         continue
  14.                     else:
  15.                         flag = 0
  16.                         break
  17.                 else:
  18.                     break
  19.             if flag == 1:
  20.                 list_prime.append(temp)
  21.                 break
  22.     while list_prime[-1] < n:
  23.         next_prime()
  24.     list_prime.pop()
  25.     result = sum(list_prime)
  26.     return result
  27. n = int(input('请输入一个正整数:'))
  28. print('%d以下的所有质数和为%d' % (n,prime_sum(n)))
复制代码


输出答案:
请输入一个正整数:2000000
2000000以下的所有质数和为142913828922

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-24 15:27:43 | 显示全部楼层
采用过滤的思想,首先过滤掉大于等于4的偶数的倍数,然后依次过滤奇数的倍数。
经测试当n = 1000000时,运行时间为2.14秒,欢迎优化
  1. # -*- encoding = 'utf-8' -*-
  2. import time
  3. # n以下的质数的和
  4. def primeNumberSum(n):
  5.     if n < 2:
  6.         return 0

  7.     if n == 3:
  8.         return 2;

  9.     prime = [i for i in range(n)]
  10.     prime[1] = 0

  11.     # 过滤掉>=4的偶数的倍数(2,4,6,8...等的倍数)
  12.     for i in range(4,n,2):
  13.         prime[i] = 0

  14.     # 过滤掉奇数的倍数
  15.     for i in range(3,n // 2,2):
  16.         # 从2 * i开始过滤
  17.         for j in range(i + i,n,i):
  18.             # 若prime[j]已经为0,则不再赋值
  19.             if prime[j]:
  20.                 prime[j] = 0

  21.     return sum(prime)

  22. if __name__ == '__main__':
  23.     begin = time.time()
  24.     print(primeNumberSum(1000000))
  25.     end = time.time()
  26.     print(str(end - begin) + 's')
复制代码

评分

参与人数 1荣誉 +7 鱼币 +7 收起 理由
冬雪雪冬 + 7 + 7 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-24 19:00:52 | 显示全部楼层
粗暴的实现了数域筛选...
  1. #如果为和数则置零,如果为质数则将它的倍数置零
  2. import time
  3. def isprime(num):
  4.     num **= 0.5
  5.     for i in range(2, int(num+1)):
  6.         if num%i==0:
  7.             return False
  8.     return True

  9. begTime = time.time()
  10. iNum = [x for x in range(2,2000001)]
  11. for n in iNum:
  12.     #忽略0
  13.     if n:
  14.         #不是质数则置零
  15.         if not isprime:
  16.             iNum[n-2] = 0
  17.             continue
  18.         #是质数则将它的倍数置零
  19.         if isprime:
  20.             #setzero()
  21.             ratio = 2
  22.             while True:
  23.                 nNext = n * ratio
  24.                 ratio += 1
  25.                 if nNext > 2000000:
  26.                     break
  27.                 iNum[nNext-2] = 0
  28.                
  29. print(sum(iNum),time.time()-begTime)
复制代码

评分

参与人数 1荣誉 +7 鱼币 +7 收起 理由
冬雪雪冬 + 7 + 7 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-25 16:09:15 | 显示全部楼层
  1. from math import sqrt
  2. NUM=2000000
  3. add=0

  4. def is_prime(num):
  5.        for i in range(2,int(sqrt(num)+1)):
  6.               if num % i == 0:
  7.                      return(0)
  8.        return(1)

  9. for i in range(2,NUM+1):
  10.        if is_prime(i):
  11.               #print(i)
  12.               add+=i
  13. print(add)
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-25 16:47:53 | 显示全部楼层
  1. # using python2
  2. import math


  3. def isprime(x):
  4.     for i in range(2, int(math.sqrt(x)) + 1):
  5.         if x % i == 0:
  6.             return False
  7.         else:
  8.             continue
  9.     return True

  10. temp = [i for i in range(3, 2000000, 2) if isprime(i)]
  11. result = 2 + sum(temp)
  12. print result
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-4-25 22:23:23 | 显示全部楼层
无标题.jpg
远程控制的树莓派 linux系统
python3下完成,代码不好复制过来,只好截图了
答案为:454396537

点评

我一行行的输入,测算了一下,可惜答案错了。  发表于 2016-4-26 21:04
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-1 11:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表