Humbi schrieb:
rklm
Ich hab mir Ruby jetzt mal bissle angeschaut für den Fall. Programmiert sich echt geschmeidig.
Da kann dir niemand einen Vorwurf machen, dass es bei dir bei vielen Antworten vorkommt. 😉
Na, da bin ich aber froh.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 | !/usr/bin/ruby
f = File.open("/home/humbi/testin")
start = Integer(f.gets)
f.close
stop = start + 1
while start < stop
i = 2
limit = Math.sqrt(start)
kill = false
prim = false
while kill == false && prim == false
mod = start % i
if mod == 0
kill = true
elsif i > limit
p = File.open("/home/humbi/testout", 'a')
p.puts(start)
p.close
prim = true
elsif i <= limit
i = i + 1
end
end
start = start + 1
end
f = File.open("/home/humbi/testin", 'w')
f.puts(start)
f.close
|
Die Shebang-Zeile ist kaputt und das ist nicht sehr idiomatisches Ruby. Was Du aber vor allem lassen solltest (nicht nur in Ruby): Vergleiche von booleschen Werten mit true
und false
. Das ist ein Rezept für Fehler, insbesondere in Sprachen, die nicht exakt je einen Wert für true
und false
haben!
Achso, rklm ich habe versucht mir "limit" ausgeben zu lassen. Aber es wird nur Infinity ausgegeben. Irgendwas hab ich gelesen in Verbindung mit Float Zahlen. Tasächlich beinhaltet die Variable eine Zahl mit Nachkommastellen. Was ist dabei sein Problem beim Ausgeben?
Dein Hauptproblem ist allerdings, dass Math.sqrt()
immer einen Float
zurückliefert. Floats gehen (bei mir) nur bis 1.7976931348623157e+308 (siehe Float::MAX
). Du brauchst eine Funktion, die eine Ganzzahl liefert, die eine Annäherung an die Wurzel ist. Oder Du stellst um, wie ich das gemacht habe:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41 | #!/usr/bin/ruby
INPUT = "/home/humbi/testin"
OUTPUT = "/home/humbi/testout"
# silly implementation!
def sqrt(n)
i = 1
while i * i < n
i += 1
end
i
end
start = Integer(File.open(INPUT) {|f| f.gets})
stop = start + 1
while start < stop
i = 2
# limit = sqrt(start)
prim = false
while (start % i) != 0 && !prim
# if i > limit
if i * i > start
File.open(OUTPUT, 'a') {|p| p.puts(start)}
prim = true
else # i <= limit
i += 1
end
end
start += 1
end
File.open(INPUT, 'w') {|f| f.puts(start)}
|
Ich hab gesehen, das Ruby wohl Multithreadding unterstützt. Das werd ich noch versuchen. Mein 12 Kerner langweilt sich beim ausführen.
Ich glaube, das wird Dir bei diesem Algorithmus nur begrenzt helfen. Außerdem hat MRI immer noch das berüchtigte GIL, wenn ich nicht falsch informiert bin.