Skip to content

Instantly share code, notes, and snippets.

@oieioi
Last active August 29, 2015 14:24
Show Gist options
  • Save oieioi/3a542cfa9c0c2887388e to your computer and use it in GitHub Desktop.
Save oieioi/3a542cfa9c0c2887388e to your computer and use it in GitHub Desktop.
get primes
raw_list = []
while str = STDIN.gets.chomp
break if str.empty?
raw_list.push str.to_i
end
class GetterPrimer
def initialize
@primes = [2]
@max_checked = 2
end
def get_primes_size_memorize(number)
if number <= @max_checked
@primes.select{|p| p < number}
.size
elsif
count = @max_checked % 2 == 0 ? @max_checked - 1 : @max_checked
while count < number
self.is_prime? count
count += 2
end
@max_checked = number - 1
@primes.size
end
end
def is_prime?(num)
# 負の数, 0, 1, 偶数は素数でない, 2は素数
if not num.is_a? Integer
return false
elsif num <= 0
return false
elsif num == 1
return false
elsif num == 2
return true
elsif num % 2 == 0
return false
elsif num <= @max_checked
return @primes.include? num
else
prime = true
# 今まで見つけた素数でチェックする
# 連番じゃないと使えない
@primes.each{ |p|
prime = false if num % p == 0
}
if prime
@primes << num
end
@max_checked = num
prime
end
end
protected :is_prime?
end
resolver = GetterPrimer.new
#raw_list.each{ |num| puts resolver.get_primes_size_memorize num.to_i }
require 'benchmark'
raw_list.each{ |num|
ans = nil
time = Benchmark.measure {
ans = resolver.get_primes_size_memorize num.to_i
}.total
puts "#{time}: #{num}, #{ans}"
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment