这是一个素数筛,但不是埃拉托色尼筛。
我觉得它写得不好,因为我对编程和 Ruby 不熟悉。这只是我用 Ruby 编写的第二个程序,但我想尽可能地优化它。问题是我对我需要改变什么以使其更快,除了我知道程序路径/数据结构并不理想之外没有一个明确的理解——我只是没有一个可以用来制作的概念他们理想
一个理想的答案不一定会说“将 X 更改为 Y”,但如果它为我指明此类信息的良好资源的方向,或者我可以从中获取有关效率的信息的方法,那将更有帮助程序的不同部分。
count = 0
x = 0
$results = Array.new []
inpt = []
class PrimeFun
def initialize(x, y)
array1 = (x..y).to_a
array1.each do |n|
if PrimeFun.primelogic(n%60, n) == 1
array1.delete_if { |p| p % n == 0}
$results << n
elsif n == 2 || n == 3 || n == 5
$results << n
end
end
end
def self.primelogic(r, n)
@prime = case r
when 1, 13, 17, 29, 37, 41, 49, 53
formulaone(n)
when 7, 19, 31, 43
formulatwo(n)
when 11, 23, 47, 59
formulathree(n)
else -1
end
end
def self.formulaone(n)
@x = 1
@y = -1
until 4*(@x**2) >= n
@y = -@y if Math.sqrt(n-(4*(@x**2))).floor - Math.sqrt(n-(4*(@x**2))) == 0
@x += 1
end
@y
end
def self.formulatwo(n)
@x = 1
@y = -1
until 3*(@x**2) >= n
@y = -@y if Math.sqrt(n-(3*(@x**2))).floor - Math.sqrt(n-(3*(@x**2))) == 0
@x += 1
end
@y
end
def self.formulathree(n)
@x = 1
@y = -1
until 3*(@x**2) >= n
@y = -@y if Math.sqrt(((@x**2)+n)/3).floor - Math.sqrt(((@x**2)+n)/3) == 0 && @x > @y
@x += 1
end
@y
end
end
x = STDIN.gets.to_i
while count < x
inpt << STDIN.gets.chomp
count += 1
end
inpt.each do |n|
a = n.split(" ").map { |a| a.to_i }
PrimeFun.new(a[0], a[1])
$results << ""
end
puts $results