java – 查找600851475143中最大的素数?
发布时间:2020-12-15 05:00:17 所属栏目:Java 来源:网络整理
导读:我试图从 http://projecteuler.net解决问题3.但是,当我运行程序时,没有打印出来. 我究竟做错了什么? 问题:600851475143的最大主要因素是什么? public class project_3 { public boolean prime(long x) // if x is prime return true { boolean bool = fal
我试图从
http://projecteuler.net解决问题3.但是,当我运行程序时,没有打印出来.
我究竟做错了什么? 问题: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); } } 解决方法
您的主要检查功能不仅总是返回错误;即使它运行正常,你的主循环根本不会寻找输入数字的因子,而只是寻找小于或等于它的最大素数.在伪代码中,您的代码相当于:
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 但是你根本不需要素数检查功能.以下查找数字的所有因子,到trial division: 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(fs,d): return d 1因为当原始数的任何复合除数d被分解时,当我们达到d时,我们已经将它的素因子除以原始数,因此减少的数将与它没有共同的素因子,即即使它除了原始数字,d也不会将减少的数字分开. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |