2008年11月18日

这里看到用Lua和写的使用筛选法求质数的代码,俺自己也写了写,版用到了上面链接中一位兄弟的tips :-)

先来C语言版的:

C:
  1. #include <stdio .h>
  2. #include <math .h>
  3.  
  4. #define NUM 2000000
  5.  
  6. int main(void)
  7. {
  8.     int primes[NUM];
  9.     int i,j;
  10.     for (i=0;i<num ;i++) {
  11.         primes[i] = 1;
  12.  
  13.     }
  14.     primes[0] = 0;
  15.     primes[1] = 0;
  16.     for (i=1;i<(long)sqrt(NUM)+1;i++) {
  17.         if (primes[i]) {
  18.             for (j=pow(i,2);j<NUM;j+=i) {
  19.                 primes[j] = 0;
  20.             }
  21.         }
  22.     }
  23.  
  24.     long sum = 0;
  25.     for (i=0;i<NUM;i++) {
  26.         if (primes[i]) sum+=i;
  27.     }
  28.     printf("%ld\n",sum);
  29.  
  30.  
  31.     return 0;
  32. }

计算两百万以内质数和大约0.1秒左右:

BASH:
  1. [cocobear@cocobear wxpython]$ time ./a.out
  2. 142913828922
  3.  
  4. real    0m0.100s
  5. user    0m0.088s
  6. sys 0m0.012s

接着来可爱的版:

:
  1. from math import sqrt
  2. NUM = 2000000
  3. prime_num = [i for i in xrange(NUM+1)]
  4. for i in xrange(2,int(sqrt(NUM))+1):
  5.     if prime_num[i]:
  6.         start = i**2
  7.         step  = i
  8.         prime_num[start::step] = ( (NUM - start)/step + 1)*[0]
  9. print sum(prime_num)-1

执行时间1秒多点:

BASH:
  1. [cocobear@cocobear wxpython]$ time prime.py
  2. 142913828922
  3.  
  4. real    0m1.204s
  5. user    0m1.051s
  6. sys 0m0.093s

不到10行的代码也有不错的效率:-)
以上测试平台为:

Fedora 9 AMD64 4600+ 4G

计算5的阶乘

标签 :

7 楼了已经

  • luguo写于08年11月18日

    呵呵,怎么想起写这个程序了?

  • Amankwah写于08年11月18日

    筛法,呵呵~

  • Amankwah写于08年11月18日

    我修改你的链接了,不要生气啊~

  • 可可熊写于08年11月19日

    别人博客上看到的,就没事写着玩了。
    老大俺还是很生气,送俺一个apple的本就不生气了。

  • wind写于08年11月20日

    话说俺的数学还是很烂,知道这个算法应该可行,但是我没法子用数学来证明……

    还有,这个背景太黑,然后代码也不亮,看得我好累啊。

  • vvoody写于08年12月15日

    学习了。
    PS:目前配色对代码阅读不太好,python 那段方括号、圆括号都看不见了,全选才能看见。
    我一开始没反应过来,想python语法什么时候变成这样了 ;-)

  • 可可熊写于08年12月31日

    配色改了,呵呵。

发表评论

在下面加入你的评论,或者 trackback 从你的博客站点。 订阅本文的评论。

:

:

:

« GRUB问题
» 代码高亮插件–使用黑色背景