By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6^(th) prime is 13.
What is the 10001^(st) prime number?
By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see that the 6^(th) prime is 13.
What is the 10001^(st) prime number?
[code=ruby]i = 2
primes = []
loop do
primes << i if (2…Math.sqrt(i).floor).all? {|e| i % e != 0 }
i += 1
break if primes.size == 10001
end
puts primes.last[/code]
Radarek zasadniczo pozamiatał, ale zrobiłem to w wersji bez tablicy, tj. mniej zasobożerną (chyba też szybszą, bo nie trzeba dopisywać )
i = 2
n = 0
loop do
n += 1 if (2..Math.sqrt(i).floor).all? {|e| i % e != 0 }
break if n == 10001
i += 1
end
puts i
Huhu, właśnie, może sobie pobenczmarkujemy?
[code=ruby]require ‘benchmark’
include Benchmark
PRIME_ID = 10001
def pr7_radarek
i = 2
primes = []
loop do
primes << i if (2…Math.sqrt(i).floor).all? {|e| i % e != 0 }
i += 1
break if primes.size == PRIME_ID
end
primes.last
end
def pr7_tomash
i = 2
n = 0
loop do
n += 1 if (2…Math.sqrt(i).floor).all? {|e| i % e != 0 }
break if n == PRIME_ID
i += 1
end
i
end
bm(20) do |x|
x.report(“radarka”) { pr7_radarek }
x.report(“tomasha”) { pr7_tomash }
x.report(“radarka2”) { pr7_radarek }
x.report(“tomasha2”) { pr7_tomash }
end[/code]
Nie wiem jak to zrobiłeś, Radarek, ale Twój teoretycznie bardziej zasobożerny (dopisywanie do tablicy) kod bywa że wypada lepiej od mojego w tym benchmarku
user system total real
radarka 9.020000 2.750000 11.770000 ( 11.867351)
tomasha 9.030000 2.670000 11.700000 ( 11.797699)
radarka2 9.050000 2.710000 11.760000 ( 11.809576)
tomasha2 8.960000 2.720000 11.680000 ( 11.748851)
albo
require "prime"
i = 1
Prime.each do |p|
p p
break if i == 10001
i += 1
end
1.9 ofc
teamon, pamiętaj, że w 1.9 możesz do każdego iteratora dodać index iteracji poprzez metodę Enumerator#with_index:
require "prime"
Prime.each.with_index do |p, i|
p p
i += 1
break if i == 10001
end
A skoro wspomniałeś o 1.9, to moja wersja:
require "prime"
puts Prime.each.take(10001).last
^^
Hm… to oznacza tylko tyle ze musze poczytac wiecej o enumeratorach ;]
W tym wypadku nie ma to znaczenia, operacji dodawania na koniec tablicy będzie tylko 10001 i jeśli dobrze pamiętam jej capacity jest zwiększane dwukrotnie (jeśli trzeba) więc realokacji będzie tylko log2(10001) ~ 13. Wąskie gardło (nie chce mi się sprawdzać czy faktycznie tak jest) jest prawd. w 1 linii pętli.
# tak juz w kwesti formalnosci i krotkiego kodu
require "prime"
p Prime.take(10001).last