project Euler第七題

上大學的時候買了個手機,上邊的遊戲都是java做的,所以在還不知道什麼是java的時候就想學習java了,但是現在都研一了,還沒有怎麼學習過java,書倒是看了不少,編程思想都看兩邊了,可是從沒用java做過程序,先是用php做網站,再是用python做網站,以後就用java做project Euler了,聊以慰藉吧。


題目:

By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6th prime is 13.

What is the 10 001st prime number?


算法1:

package ten;

public class Problem7 {
    public static void main(String args[]){
        int i=2,j=0;
        for(;j<10001;i++){
            Prime prime = new Prime(i);
            if(prime.is_prime()){
                j++;
            }
        }
        System.out.println(i-1);

    }
}

class Prime{
    public int num;
    
    public Prime(int i){
        num = i;
    }
    public boolean is_prime(){
        for(int i=2;i*i<=num;i++){
            if(num%i == 0){
                return false;
            }
        }
        return true;
    }
}


算法2:

package ten;

public class Problem7 {
    public static void main(String args[]){
        int i=3,j=1;
        for(;j<10001;i+=2){
            Prime prime = new Prime(i);
            if(prime.is_prime()){
                j++;
            }
        }
        System.out.println(i-2);

    }
}

class Prime{
    public int num;
    
    public Prime(int i){
        num = i;
    }
    public boolean is_prime(){
        for(int i=2;i*i<=num;i++){
            if(num%i == 0){
                return false;
            }
        }
        return true;
    }
}


結果:104743


兩個算法基本上是一樣的,第二個要比第一個好一點,第一個就是從二開始一個一個的算每個數是不是素數,直到找到第10001個爲止。因爲除了2以外所有的素數都是奇數,所以就從3開始判斷,而且只判斷奇數。

最近一直用python,乍一寫java還很是不習慣,特別是在語法上,其實還是比較喜歡python,覺得python更優雅一些。下邊也給出第二種算法的python版:

#!/usr/bin/env python
#coding=utf-8

import time

def timeit(fn):
    def decorator():
        start = time.time()
        fn()
        end = time.time()
        print end - start
    return decorator
    
def is_prime(num):
    i = 2
    while i**2<=num:
        if num%i == 0:
            return False
        i += 1
    return True
@timeit
def prime():
    j,k = 3,1
    while k<10001:
        if is_prime(j):
            k += 1
        j += 2
    print j-2

if __name__ == '__main__':
    prime()




發佈了38 篇原創文章 · 獲贊 7 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章