Leser: 4
|< 1 ... 5 6 7 8 >| | 77 Einträge, 8 Seiten |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#!/usr/bin/perl use strict; use warnings; use Data::Dumper; sub is_prime { my $i = shift; die if $i < 2; return 2 if $i == 2; $i % $_ == 0 and return for 2..(($i/2)+1); return $i; } my $number = shift @ARGV || 129; print Dumper [grep is_prime($_), 2..$number];
Ronnie+2008-07-04 17:51:26--Als Anregung dient dir evtl. folgendes Snippet:
Code (perl): (dl )$i % $_ == 0 and return for 2..(($i/2)+1);
1 2 3
for my $teiler (2..(($i/2)+1)) { return 0 if $i % $teiler == 0; # Abbrechen wenn kein Rest bleibt }
KurtZ+2008-07-04 18:05:24--Ich starre nun seit 2 Minuten auf diese Zeile und empfinde sie als Anregung Python zu erlernen!
KurtZ+2008-07-04 18:05:24--aber mathematisch wärs erstens sinnvoller nur die teiler bis wurzel i zu betrachten, und zwotens könnte man sich auf die bekannten Primzahlen kleiner sqrt(i) beschränken, statt alle Zahlen zu betrachten. Das käme dem Sieb des Erathostenes viel näher.
Napstack+2008-07-04 16:34:12--ich bin im 7. und nein wir hatte es noch nicht
pq+2008-07-04 19:49:42--
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 42 43 44 45 46 47 48 49 50 51 52
#!/usr/bin/perl use strict; use warnings; my ($Zahl, $is_prime, $p); my @prime = ("2"); print "Bis zu welcher Zahl sollen die Primzahlen gesucht werden?"; chomp(my $Ziel = <STDIN>); foreach $Zahl (3..$Ziel) { ### $is_prime ist ein Anzeiger, ob $Zahl eine Primzahl ist; ### wir gehen erstmal davon aus, dass sie eine ist (1 bedeutet hier WAHR) $is_prime = 1; #Wofür ist $p was macht sie und brauche ich das for noch? ### $p ist die Laufvariable innerhalb der Schleife; ### das foreach macht klar, dass Du hier in einer Schleife jedes Element aus @prime ### durchforsten willst; dafuer wird jedes Element einmal in $p abgelegt, damit du ### damit arbeiten kannst; foreach $p (@prime) { ### also pruefen, ob die aktuelle $Zahl durch eine der zuvor gefundenen Primzahlen ### teilbar ist; d.h. wenn kein Rest bei der Division uebrig bleibt if ($Zahl % $p == 0){ ### $Zahl ist durch $p teilbar und kann also keine Primzahl sein ### deswegen setzen wir $is_prime auf 0 (0 bedeutet UNWAHR) $is_prime = 0; ### Bevor du sicher bist, dass $Zahl eine Primzahl ist, gibst Du hier die $Zahl ### schon aus und packst sie zu den Primzahlen? ### Das kann nicht richtig sein; denn wie eben gerade festgestellt, kommen ### wir nur hier hin, weil $Zahl durch $p teilbar ist; damit ist es *keine* ### Primzahl... als raus damit... #weg: print $Zahl, "\n"; #weg: push @prime, $Zahl; #Was macht das last? ### Weil wir ein $p gefunden haben, durch das $Zahl teilbar ist, brauchen wir ### kein weiteres $p pruefen; $Zahl ist keine Primzahl; ### also brechen wir mit 'last' die (innere) Schleife ab last; } } ### Ende innerer Schleife ### $Zahl kann nur dann eine Primzahl sein, wenn sie durch keine in @prime enthaltene ### Zahl teilbar ist; damit Du sicher sein kannst, dass $Zahl eine Primzahl ist, musst ### Du nun $is_prime pruefen, um $Zahl zu den Primzahlen in @prime packen zu koennen. ### Welchen Wert musst $is_prime dafuer haben? }
1
2
3
4
5
6
7
8
$Zahl = 3; @p = (2);
3 % 2 = Rest 1, also wird 3 an @p gepackt; ### das ist OK
$Zahl = 4; @p = ( 2, 3 );
4 % 2 = Rest 0; also nächste Zahl aus @p testen
4 % 3 = Rest 1, also wird 4 an @p gepackt ### das ist nicht mehr OK
Wir müssen dabei bedenken, dass $Zahl jetzt 4 enthaelt, und wir diese 4 an @p anhaengen ...
Ronnie+2008-07-04 19:44:59--*lacht* - ich müsste ausprobieren ob es als Listcomprehension in Python nicht ähnlich aussieht ;)
1 2
return scalar grep { $i % $_ == 0 } (2 .. sqrt($i)); # 0 wenn es keinen restfreien Teiler gibt
for ( 2 .. sqrt($i) ) { return $_ unless $i % $_ }
for ( 2 .. sqrt($i) ) { return $_ if $i % $_ == 0}
|< 1 ... 5 6 7 8 >| | 77 Einträge, 8 Seiten |