java 最大素数_java – 查找600851475143中最大的素数?

您的主要检查功能不仅总是返回错误;即使它运行正常,你的主循环根本不会寻找输入数字的因子,而只是寻找小于或等于它的最大素数.在伪代码中,您的代码相当于:

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也不会将减少的数字分开.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值