上大学的时候买了个手机,上边的游戏都是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()