Thread Mit Perl rechnen (76 answers)
Opened by Napstack at 2008-07-03 17:04

Napstack
 2008-07-05 01:18
#111865 #111865
User since
2008-07-03
32 Artikel
BenutzerIn
[default_avatar]
So hier noch mal eine Ausführliche erklärung. An dieser Stelle nochmal ein ganz großes danke an Linuxer.

Dieser code basirt auf dem #46 Beitrag. Allerdings ist der Code hier von Linuxer mit infos voll gestopft.
Code (perl): (dl )
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?
}


Schauen wir uns mal an, was passiert wenn wir in der inneren Schleife $Zahl % $p >= 1 verwenden.
Code: (dl )
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 ...


Also muss
print $Zahl, "\n";
push @prime, $Zahl;
außerhalb der inneren Schleife eingefügt werden.

Eine komplettlösung will ich hier nicht reinstellen weil dann kein lernefekt da ist.



Zum Schluss möchte ich mich nochmal bei allen, die ich "angeprollt" habe entschuldigen.

View full thread Mit Perl rechnen