[Project Euler] 来做欧拉项目练习题吧: 题目010

                                     [Project Euler] 来做欧拉项目练习题吧: 题目010

                                                                  周银辉 

 

问题描述:

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

Find the sum of all the primes below two million. 

 

问题分析:

求小于2000000的所有素数之和。

非常简单,还记得第7题的“筛法求素数”吧, 采用相同的方法就可以了,在建立素数缓冲区的过程中随便累计一下就是该题的答案了。

#include <stdio.h>
#include <stdlib.h>
long long getSum(int n)
{
long long sum = 0;
char *array=(char*) malloc(n+1);
int i;
for(i=0; i<n+1; i++)
{
array[i]='r';   //'r' : remain
}
array[0]='d';         //'d' : delete
array[1]='d';
int p=2;
while(p*p<=n)
{
if(array[p]=='r')
{
int j;
for(j=2; j*p<=n; j++)
{
array[j*p]='d';
}
}
p++;
}
for(p=2; p<=n; p++)
{
if(array[p]=='r')
{
sum += p;
}
}
free(array);
return sum;
}
int main()
{
int max=2000000;
long long sum = getSum(max);
printf("sum of the prime numbers under %d is %lld\n", max, sum);
return 0;
}

注:当完成题目后,对于某些题,官方网站会给出参考答案,在我的博客里不会将官方答案贴出来,仅仅会写下我自己当时的思路,除非两者不谋而合。另外,如果你有更好的思路,请留言告诉我,我非常乐意参与到讨论中来。

posted @ 2011-02-14 07:06 周银辉 阅读(1970) 评论(7) 编辑 收藏

 回复 引用 查看   
#1楼 2011-02-14 08:40 装甲熊猫      
强烈建议使用ruby或python之类的语言。我原来做PE时也用C,但是觉得很多时间都花在一些程序细节上了。现在使用ruby感觉代码更简洁了。至于效率,按PE的说法不管用什么语言写,1分钟是上限。
 回复 引用 查看   
#2楼 2011-02-14 09:24 Rugby Player      
楼主的代码可以优化:
while(p*p<=n)
{
if(array[p]=='r')
{
int j;
for(j=2; j*p<=n; j++)
{
array[j*p]='d';
}
}

p++;
}
内循环里面完全可以做到如果j是合数就跳出循环,省了很多时间。



 回复 引用 查看   
#3楼[楼主] 2011-02-14 10:09 周银辉      
@Rugby Player
Thank you~~~~`

 回复 引用 查看   
#4楼 2011-02-14 10:18 mirguest      
def isprime(n):
    for t in range(2,int(n**0.5)+1):
        if n%t==0:
            return False
    return True
def problem10(n):
    total=0
    for i in xrange(2,n+1):
        if isprime(i):
            total+=i
    return total
if __name__=='__main__':
    print problem10(2000000)


 回复 引用 查看   
#5楼 2011-02-14 10:30 装甲熊猫      
楼上的,参考http://www.ruby-doc.org/core-1.9/classes/Integer.html,有个prime?方法。
 回复 引用 查看   
#6楼[楼主] 2011-02-14 10:51 周银辉      
@装甲熊猫
非常感谢。
另外,就语言的话,我是建议选择C的。如果要运用语言特性让代码简洁的话,我截了个图:

 回复 引用 查看   
#7楼 2011-02-14 11:58 Regular      
以下为Scala代码,没有充分调优。不过性能还好。大概4秒左右。
做筛查的时候,直接除以素数,因此筛查量减少了很多。
import scala.collection.mutable.ListBuffer

object Prime {
  def main(args : Array[String]) : Unit = {
      val seq : ListBuffer[Int] = new ListBuffer[Int]()
      var j: Long = 0
      for {
          i <- 2 to 2000000
          if (filter(i, seq))
      } {
          seq.append(i)
          j += i
      }
      println (j)
  }
  def filter(i: Int, seq: ListBuffer[Int]): Boolean = {
      for (j <- seq) {
          if (i < j * j) {
              return true
          }
          if (i % j == 0) {
              return false
          }
      }
      true
  }
}


发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1953995 aYC29f6hpCc=