java生成大素数_代码优化 - 生成素数

如果数字为2,则返回true;如果数字可被2整除,则返回false .

开始迭代3,而不是2.使用两步 .

迭代到数字的平方根,而不是数字减1 .

def prime?(number)

return true if number == 2

return false if number <= 1 or number % 2 == 0

(3..Math.sqrt(number)).step(2) do |n|

return false if number % n == 0

end

true

end

@Technation解释说,这会快得多,但仍然不会很快 .

以下是使用Sieve of Eratosthenes built into Ruby的方法 . 您需要将所有素数预先计算到最大值,这将非常快,然后选择每个范围内的素数 .

require 'prime'

ranges = Array.new(gets.strip.to_i) do

min, max = gets.strip.split.map(&:to_i)

Range.new(min, max)

end

primes = Prime.each(ranges.map(&:max).max, Prime::EratosthenesGenerator.new)

ranges.each do |range|

primes.each do |prime|

next if prime < range.min

break if prime > range.max

puts prime

end

primes.rewind

puts "\n"

end

以下是各种解决方案在50000 200000范围内的性能:

你的原始素数?功能:1m49.639s

我修改了素数?功能:0m0.687s

Prime :: EratosthenesGenerator:0m0.221s

处理的范围越多,Prime :: EratosthenesGenerator方法应该越快 .

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值