007
08.02.2006, 19:07 Uhr
predator
|
Naja, alle Zahlen, die vorkommen müssen ja natürlich sein (siehe Def. von Primzahl). Angenommen es gilt
1. Möglichkeit:
Code: |
i = sqrt(zahl) => x = sqrt(zahl)
|
Wenn i die Wurzel aus zahl ist, muss natürlich auch x die Wurzel aus zahl sein.
2. Möglichkeit:
Code: |
i > sqrt(zahl) => x < sqrt(zahl)
|
Wenn i größer als sqrt(zahl) ist, muss x kleiner als sqrt(zahl) sein.
Du teilst in deiner Funktion ifPriem (sollte besser isPrim heißen) mit dem Modulo-Operator ja zahl durch i und überprüfst den Rest.
Wenn du diese Modulo-Operation durchführst, und es wird 0 zurückgegeben, bedeutet dies ja, dass zahl durch i ohne Rest teilbar ist. Das heißt aber gleichzeitig, dass es eine andere natürliche Zahl x gibt, die mit i multipliziert zahl ergibt, denn
Code: |
zahl / i = x (ohne Rest) zahl = x * i
|
Wenn i jetzt größer als sqrt(zahl) ist, und die Modulo-Operation 0 zurückgibt, bedeutet dies ja erstens, dass x kleiner als sqrt(zahl) sein muss (s. o.), und somit zweitens (und das ist das entscheidende), dass i in einem früheren Schleifendurchlauf schonmal x war.
Wenn es also bis zur Wurzel aus zahl keine natürlichen Teiler gab, wird es auch bei Werten größer als sqrt(zahl) keine geben. (außer natürlich die Zahl selbst)
Ich hoffe, das war verständlich... Man hätte es wahrscheinlich viel einfacher erklären können, aber naja.
Zu deiner 2. Frage: Warum willst du double nehmen? Das ist doch ein Fließkommatyp, und das dürfen Primzahlen ja nicht sein. -- Gruß predator
Zitat von Edsger W. Dijkstra: |
Es ist praktisch unmöglich, einem Studenten gutes Programmieren beizubringen, wenn er vorher in BASIC programmiert hat. Als potenzielle Programmierer sind sie geistig verstümmelt ohne Hoffnung auf Erholung.
|
|