鱼C论坛

 找回密码
 立即注册
查看: 8523|回复: 72

题目10:计算两百万以下所有质数的和

[复制链接]
发表于 2015-4-21 00:19:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 不二如是 于 2017-6-11 22:38 编辑
Summation of primes

The sum of the primes below 10 is 2 + 3 + 5 + 7 = 17.

Find the sum of all the primes below two million.


题目:

10 以下的质数的和是 2 + 3 + 5 + 7 = 17。

找出两百万以下所有质数的和。


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-5-17 07:22:23 | 显示全部楼层
这不就是欧拉的题目么 谢谢翻译O(∩_∩)O哈! 当时刚学C时我做了十多题 但是怎奈英语太烂翻译出来的 ........ 高考考完后我一定来捧场
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-17 21:04:19 | 显示全部楼层
本帖最后由 翅膀团 于 2015-11-16 14:12 编辑

#include <stdio.h>
#define NUM 2000000

int main(void)
{
    int i,j,result=0;
   
    for(i=2;i<NUM;i++)
    {
    for(j=2;j<i;j++)
    {
    if(i % j ==0)
    {
    goto z;
    }   
    }
    result += i;
z:  j=2;
    }
    printf("%d\n",result);
}

如果有错误希望指出
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-19 21:59:46 | 显示全部楼层
翅膀团 发表于 2015-7-17 21:04
#include
#define NUM 2000000

printf("%d\n",result);
就看你这一句就知道肯定错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-20 15:20:16 | 显示全部楼层
牡丹花下死做鬼 发表于 2015-7-19 21:59
printf("%d\n",result);
就看你这一句就知道肯定错

还请指明哪里错了,这个办法虽然笨了点,慢了点,但还是能算出结果的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-21 08:11:50 From FishC Mobile | 显示全部楼层
翅膀团 发表于 2015-7-20 15:20
还请指明哪里错了,这个办法虽然笨了点,慢了点,但还是能算出结果的

你确定 int 装的下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-7-21 12:25:44 | 显示全部楼层

你的机子int的范围我不知道,但我的机子的int是4字节,即-2147483648 ~ +2147483647 。2百万还是装得下的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-1-24 13:36:04 | 显示全部楼层
本帖最后由 mysteri0n 于 2016-1-24 13:50 编辑
  1. #python 2.7.11

  2. def isprime(num):
  3.     for i in range(2,int(num**0.5)+1):
  4.         if num % i == 0:
  5.             return False
  6.     return True

  7. print 2 + sum(num for num in xrange(3,2000000,2) if isprime(num))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-1 23:04:23 | 显示全部楼层
楼上的运行了半天出不来,效率太低了,这个秒出答案。判断质数的最快的方法。


int main()
{
    long i,j,gab=2,count,total=3,sum=10;
    long prime[1000000]={2,3,5};
    for(i=7;i<2000000;i+=gab)
    {
        count=1;
        gab=6-gab;
        for(j=0;prime[j]*prime[j]<=i;j++)
        {
            if(i%prime[j]==0)
            {
                count=0;
                break;
            }
        }
        if(count)
        {
            prime[total]=i;
            total++;
            sum+=i;
        }
    }
    printf("%ld\n",sum);
}


答案  142913828922
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-13 17:33:38 | 显示全部楼层
  1. list1=[2]
  2. x=1
  3. sum1=2
  4. while x<=2000000:
  5.     a=1
  6.     x+=2
  7.     for i in list1:
  8.         if i**2>x:
  9.             break
  10.         if x%i==0:
  11.             a=0
  12.             break
  13.     if a:
  14.         sum1+=x
  15.         list1.append(x)
  16. print(sum1)
复制代码


142913828922
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-7 08:03:32 | 显示全部楼层
# 修改自我的另一份代码, 部分代码或差劲, 能出结果就行.
  1. time ./sum200
  2. (p) 2
  3. (p) 3
  4. (p) 5
  5. (p) 0
  6. (p) 0
  7. (next)(p) 148933
  8. (prime p) 0
  9. sum 142913828922.000000

  10. real        0m0.685s
  11. user        0m0.648s
  12. sys        0m0.024s
复制代码
  1. #include <stdio.h>
  2. #include <math.h>

  3. #define LEN 2000000
  4. int main(){
  5.     static int prime[LEN] = {2, 3, 5};
  6.     static int num[LEN] = {0, 0, 2, 3, 0, 5};
  7.     int i, j;
  8.     int p, root, found;
  9.     double sum;

  10.     for (i=0; i<5; i++) {
  11.         printf("(p) %d\n", prime[i]);
  12.     }

  13.     for (i=6; i<LEN;) {
  14.         i++;
  15.         num[i] = i;
  16.         i++;
  17.     }

  18.     for (i=6; i<LEN;) {
  19.         i += 3;
  20.         num[i] = 0;
  21.     }

  22.     for (i=5; i<LEN;) {
  23.         i += 5;
  24.         num[i] = 0;
  25.     }

  26.     p = 3;
  27.     printf("(next)");
  28.     for (i=7; i<LEN;i++) {
  29.         if (num[i] > 0) {
  30.             root = (int)sqrt(num[i]);
  31.             for (j=3; j<root; j++) {
  32.                 if (prime[j] > root ) {
  33.                     found = 1;
  34.                     break;
  35.                 }
  36.                 if (num[i] % prime[j] == 0) {
  37.                     found = 0;
  38.                     break;
  39.                 }
  40.                 else {
  41.                     found = 1;
  42.                 }
  43.             }
  44.             if (found == 1) {
  45.                 prime[p] = num[i];
  46.                 p++;
  47.                 if (p == LEN) {
  48.                     break;
  49.                 }
  50.             }
  51.         }
  52.     }

  53.     printf("(p) %d\n", p);
  54.     printf("(prime p) %d\n", prime[p]);
  55.     for (sum=0,i=0;i<LEN;i++){
  56.         sum += prime[i];
  57.     }
  58.     printf("sum %lf\n", sum);
  59. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-7 08:19:58 | 显示全部楼层
  1. time pypy prime.py
  2. 142913828922

  3. real        0m1.345s
  4. user        0m1.228s
  5. sys        0m0.024s
  6. time python2 prime.py
  7. 142913828922

  8. real        0m20.487s
  9. user        0m18.916s
  10. sys        0m0.024s
  11. time python3 prime.py
  12. 142913828922

  13. real        0m52.103s
  14. user        0m48.540s
  15. sys        0m0.044s
  16. pypy --version
  17. Python 2.7.10 (5.3.1+dfsg-1, Jun 18 2016, 12:54:36)
  18. [PyPy 5.3.1 with GCC 5.4.0 20160609]
  19. python --version
  20. Python 2.7.11
  21. python3 --version
  22. Python 3.5.2
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-7 08:35:45 | 显示全部楼层
ppsuc_wuj 发表于 2016-3-1 23:04
楼上的运行了半天出不来,效率太低了,这个秒出答案。判断质数的最快的方法。
  1. time ./prime
  2. 142913828922.000000

  3. real        0m0.614s
  4. user        0m0.592s
  5. sys        0m0.000s
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-7 09:14:58 | 显示全部楼层
  1. $  time pypy prime.py
  2. 142913828922

  3. real        0m5.094s
  4. user        0m4.712s
  5. sys        0m0.016s
  6. $  time python2 prime.py
  7. 142913828922

  8. real        0m58.416s
  9. user        0m53.648s
  10. sys        0m0.016s
  11. $  time python3 prime.py
  12. 142913828922

  13. real        1m21.485s
  14. user        1m19.448s
  15. sys        0m0.024s
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-9-16 14:04:36 | 显示全部楼层
  1. import math

  2. def find_prime(max_x):
  3.     prime_list = [2,3,5,7]

  4.     k = 9
  5.     while k<max_x:
  6.         total_yushu = 0
  7.         square_root = math.sqrt(k)
  8.         for each in prime_list:
  9.             if each > square_root:
  10.                 break
  11.             if k%each ==0:
  12.                 total_yushu = 1
  13.                 break
  14.         if total_yushu == 0:
  15.             prime_list.append(k)
  16.         k+=2

  17.     return prime_list

  18. if __name__=='__main__':
  19.     import timeit
  20.     import math
  21.     print(sum(find_prime(2000000)))
复制代码

结果是142913828922
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2016-9-17 00:24:43 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-10-10 16:34 编辑
  1. def isPrime(n):
  2.         if n == 2: return True
  3.         elif n%2 == 0: return False
  4.         elif (n-1)/6 != int((n-1)/6) or (n+1)/6 != int((n+1)/6): return False
  5.         else:
  6.                 for i in range(3,int(n**0.5+1),2):
  7.                         if n%i == 0: return False
  8.                 return True

  9. cal, summ = 3, 2
  10. while cal < 2000000:
  11.         if isPrime(cal): summ += cal
  12.         cal += 2
  13. print summ

  14. ========================
  15. 142913828922
  16. [Finished in 9.7s]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-10 19:23:44 | 显示全部楼层
最快的求质数的方法:
142913828922
[Finished in 1.8s]

  1. def getPrime(n):
  2.         primes = [True]*n
  3.         primes[0],primes[1]=False,False
  4.         for (i, prime) in enumerate(primes):
  5.                 if prime:
  6.                         for j in range(i*i,n,i): primes[j] = False
  7.         return [k for (k,trueprime) in enumerate(primes) if trueprime]

  8. print (sum(getPrime(2000000)))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 7 反对 0

使用道具 举报

发表于 2016-10-12 08:22:09 | 显示全部楼层
  1. def is_prime(number):
  2.     if number in [0,1]:
  3.         return False
  4.     if number == 2:
  5.         return True
  6.     for i in range(2,int(number**0.5)+1):
  7.         if not number%i:
  8.             return False
  9.     return True

  10. def euler(x):
  11.     return sum([y for y in range(x+1) if is_prime(y)])

  12. if __name__ == '__main__':
  13.     print(euler(2000000))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-26 19:22:38 | 显示全部楼层
本帖最后由 376103327 于 2016-10-26 19:25 编辑

import math
list1 = []
for i in range(2, 2000000+1):
    for j in range(2, int(math.sqrt(i))+1):
        if i % j == 0:
            break
    else:
        print i
        list1.append(i)
print sum(list1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-11-11 22:38:58 | 显示全部楼层
  1. #找出两百万以下所有质数的和
  2. import math
  3. import time

  4. def isPrime(n):
  5.     if n<2:
  6.         return False
  7.     elif n==2:
  8.         return True
  9.     else:
  10.         m=int(math.sqrt(n))
  11.         for i in range(2,m+1):
  12.             if n%i==0:
  13.                 return False
  14.         return True

  15. def primeSum(n):
  16.     s=0
  17.     for i in range(1,n):
  18.         if isPrime(i):
  19.             s+=i
  20.     return s

  21. start=time.clock()

  22. print("两百万以内的质数之和为:"+str(primeSum(2000000)))

  23. end=time.clock()

  24. print("耗时:"+str(end-start)+"秒")



复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-23 22:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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