Willkommen |
|
myGully |
|
Links |
|
Forum |
|
|
|
 |
08.06.10, 19:43
|
#1
|
Anfänger
Registriert seit: Jun 2010
Beiträge: 2
Bedankt: 0
|
PHP-Neuling
Also ich habe heute mit PHP angefangen und wollte dann auch meine ersten einfachen Skripts schreiben. Unter anderem wollte ich eine Skript schreiben, welches testet, ob es sich bei einer bestimmten Zahl um eine Primzahl handelt.
Also hab ich mir überlegt, dass das Skript erst einmal kontrollieren muss durch wie viele Zahlen die zu testende Zahl teilbar ist. (Das habe ich noch hinbekommen)
Jetzt wollte ich noch, dass das Skript bei einer Primzahl "Primzahl schreibt und bei einer Nicht Primzahl "Keine Primzahl" schreibt. Da ist mein Problem. Ich wollte das ganze mit if machen aber mir wird immer Primzahl angezeigt.
PHP-Code:
<?php
$prime=12; $start=1; $count=0; for (;$start<=$prime;){ if($prime%$start) { $start++;} else {$count++; $start++;} }
if ($count=2) { echo 'Primzahl';} else {echo 'Keine Primzahl'; echo $prime. 'hat'. $count. 'Teiler';} ?>
|
|
|
08.06.10, 20:03
|
#2
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
|
hehe,
a) gidf: [ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
b) funktionen sind auch dein freund.
dann kannst du
Code:
function /*bool */ isPrime (/* int */$i) {
// compute ...
return $someBoolean;
}
if (isPrime (12)) {
echo "ja";
}
else {
echo "nein";
}
machen.
__________________
entropie erfordert keine wartung
|
|
|
08.06.10, 20:12
|
#3
|
Anfänger
Registriert seit: Jun 2010
Beiträge: 2
Bedankt: 0
|
Okay Danke schon mal. Mich würde aber trotzdem interessieren, warum bei mir immer der obere Teil des If Bedingung angezeigt wird.
|
|
|
08.06.10, 20:22
|
#4
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
|
naja, debuggen, debuggen und nochmals debuggen :P
deine funktion sieht ja fast so aus:
Code:
function isPrime ($i) {
$prime = $i;
$start = 1;
$count = 0;
for (; $start <= $prime ;){
if($prime % $start) {
$start++;
}
else {
$count++;
$start++;
}
}
return $count == 2;
}
und da ist irgendetwas falsch.
edit
insbesondere ist:
falsch
__________________
entropie erfordert keine wartung
|
|
|
08.06.10, 21:08
|
#5
|
Erfahrener Newbie
Registriert seit: Apr 2010
Beiträge: 172
Bedankt: 31
|
Zitat:
Zitat von urga
insbesondere ist:
falsch 
|
Vielleicht klärst du ihn auch auf, wieso!
Bei PHP (ähnlich auch bei C/C++/Java) ist der Zuweisungsoperator = nicht das gleiche wie der Vergleichsoperator == (in PHP sogar noch === für typengerechte Vergleiche).
PHP interpretiert alle Zahlen außer 0 und alle Zeichenfolgen außer einem leeren String "" als TRUE, die restlichen Fälle als FALSE.
ist identisch mit
Code:
$count = 2;
if ($count);
Was du erreichen wolltest, ist zu prüfen, ob count gleich 2 ist. Das funktioniert so:
Schöner ist noch nachfolgende Variante, die den Fehler der Verwechslung von Zuweisung und Vergleich verhindert:
Ich empfehle nachfolgend immer letztes Beispiel einzusetzen!
|
|
|
08.06.10, 21:22
|
#6
|
Mitglied
Registriert seit: Aug 2009
Ort: void* (*wtf[])(void **);
Beiträge: 453
Bedankt: 137
|
Zitat:
Vielleicht klärst du ihn auch auf, wieso!
|
nein. diese schmerzen muss man selbst erfahren. außerdem hab' ich bei seiner funktion per
Code:
return $count == 2;
einen hinweis geliefert. (und dadurch auch erst den fehler gefunden  )
__________________
entropie erfordert keine wartung
|
|
|
08.06.10, 21:43
|
#7
|
Erfahrener Newbie
Registriert seit: Apr 2010
Beiträge: 172
Bedankt: 31
|
Noch ein kleiner Hinweis zum Algorithmus:
Wenn du eine Zahl N testen willst, ob sie eine Primzahl ist, reicht es aus bis M*M >= N zu testen.
Zur Erklärung:
Sofern die Zahl N bis M keinen Teiler hat, so wird sie darüber auch keinen mehr finden.
Es reicht weitehrin aus, nur 2 und alle ungeraden Zahlen zu testen. Sollte N nicht durch 2 teilbar sein, ist sie durch keine gerade Zahl teilbar! Das halbiert schonmal die Zahlen, die untersucht werden müssen..
Beispiel:
Zahl ist 301. 19*19 ist > 301 => folglich nur bis 17 prüfen.
Zu Prüfen wären als Teiler:
2, 3, 5, 7, 9, 11, 13, 15, 17, Abbruch.
Vielleicht realisierst du das mal.
|
|
|
Forumregeln
|
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren
HTML-Code ist Aus.
|
|
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:35 Uhr.
().
|