上大學的時候買了個手機,上邊的遊戲都是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()