project Euler第七题

15 篇文章 0 订阅
12 篇文章 0 订阅

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值