寻找最大素数出600851475143?(Finding largest prime number

2019-07-21 04:38发布

我试图从解决问题3 http://projecteuler.net 。 然而,当我运行程序的东西没有打印出来。 我究竟做错了什么? 问题:什么是号码600851475143的最大质因数?

public class project_3 
{
    public boolean prime(long x)   // if x is prime return true
    {
        boolean bool = false;

        for(long count=1L; count<x; count++)
        {
            if( x%count==0 )
            {
                bool = false;
                break;
            }
            else { bool = true; }
        }
        return bool;
    }

    public static void main(String[] args)
    {
        long ultprime = 0L;  // largest prime value
        project_3 object = new project_3();

        for(long x=1L; x <= 600851475143L; x++)
        {
            if( object.prime(x)==true )
            {
                ultprime = ((x>ultprime) ? x : ultprime);
            }
        }
        System.out.println(ultprime);
    }
}

Answer 1:

不仅你的prime检查功能总是返回false ; 即使是正常,主循环不求输入的数字的因素可言,而只是最大的素数小于或等于它。 在伪代码,你的代码就相当于:

foo(n):
    x := 0 ;
    foreach d from 1 to n step 1:
        if is_prime(d):          // always false
            x := d
    return x                     // always 0

is_prime(d):
    not( d % 1 == 0 )            // always false

但你并不需要在这里的主要检查功能在所有。 下面发现一个号码的所有因素,由审判庭 :

factors(n):
    fs := []
    d  := 2
    while ( d <= n/d ):
        if ( n % d == 0 ): { n := n/d ; fs := append(fs,d) }
        else:              { d := d+1 }
    if ( n > 1 ): { fs := append(fs, n) }
    return fs

对于可分测试仅达数的平方根来完成。 每个因素,因为它被发现,被分割出的数量被因式分解,从而进一步降低了运行时间。 有问题的数量分解立即运行,只是服用1473迭代。

通过构建这样找到的所有因素都保证是素数(这就是为什么不需要黄金的检查)。 关键是要列举可能的除数在升序要做到这一点1。 升序也是最有效的 ,因为任何给定的数字更可能有小素因子大于一个。 枚举的素数 ,而不是闹别扭,虽然不是必要的,效率会更高,如果你有通过让那些素数,测试鸿沟的一种有效方式。

这是微不足道的增加上面找到的最大因素:刚刚实施append

append(fs,d):
    return d



Answer 2:

两件事情:

1)你开始count为1而不是2.所有整数由1整除。

2)你正在运行为O(n ^ 2)算法对相当大的N(或者至少你会一旦你解决点#1)。 运行时间将相当长。



Answer 3:

项目欧拉的全部意义就是最明显的方法找到了答案,将需要很长时间来计算,他们是不值得运行。 这样,你学会寻找不太明显,更有效的方法。

你的做法是在它是否能够计算一些数的最大质的方面技术上是正确的。 你没有看到任何东西打印出来的原因是,你的算法是不能够迅速地解决问题。

你设计这个问题的方法,它会在某个地方需要大约400万年才能完成。

如果更换了600851475143号有说20将能够很快完成。 但是,你有600十亿数,所以它不是那么简单。



文章来源: Finding largest prime number out of 600851475143?