Problem bei Primzahlenaufgabe
-
Hiho,
ich hab ein Problem bei folgender Aufgabe:
Scheiben Sie eine Funktion in der Sprache C1, welche pruft, ob der im Übergabeparameter zahl enthaltener ganzzahlige Wert eine Primzahl ist. Eine Primzahl ist eine Zahl, welche nur durch 1 und sich selbst teilbar ist. Die Funktion muss den Namen primzahl tragen. Senden Sie Ihre Funktion mit folgenden
Rahmenprogramm ein.prog aufgabe // Ihre Funktion { int x; read(x); if (primzahl(x)) { print(x); print(" ist eine Primzahl.\n"); } else { print(x); print(" ist keine Primzahl.\n"); } }
Bin noch ein ziemlicher Anfänger, meine Lösung klappt irgendwie nicht,ich bitte um Korrektur
prog aufgabe int primzahl (int y) { int i; for(i=2; i<y; i++) if ( y % i == 0 ) { return 1; } return x; } { int x; read(x); if (primzahl(x)) { print(x); print(" ist eine Primzahl.\n"); } else { print(x); print(" ist keine Primzahl.\n"); } }
-
- Welches x willst du da denn zurückgeben? In der Funktion existiert kein x.
- Du brauchst nur bis y/2 zu iterieren. Alles darüber kann sowieso nicht mehr geteilt werden.
- Du machst es genau falsch 'rum. Du gibst 1 (ist eine Primzahl) zurück, wenn y%i==0, also wenn ein ganzzahliges Teilen ohne Rest möglich ist. Dann ist es aber keine Primzahl mehr.
-
Schon mal die Suchfunktion benutzt? Es gibt genug Thread bzgl. Primzahlen.
-
_matze schrieb:
- Du brauchst nur bis y/2 zu iterieren. Alles darüber kann sowieso nicht mehr geteilt werden.
sogar nur bis sqrt(y).
--> http://en.wikipedia.org/wiki/Trial_division
-
Ja suchfunktion habe ich benutzt, aber hab nichts genaues dazu gefunden wie ich es in c1 mache.
also nach deinen korrekuten matze ungefähr so:?prog aufgabe int primzahl (int y) { int i; for(i=2; i<y/2; i++) if ( y % i == 0 ) { return 0; } return 1; } { int x; read(x); if (primzahl(x)) { print(x); print(" ist eine Primzahl.\n"); } else { print(x); print(" ist keine Primzahl.\n"); } }
-
Es ist ineffizient, alle Zahlen zwischen 2 ... y/2 bzw. 2 ... sqrt(y) zu testen. Es reicht vollkommen, nur die ungeraden Zahlen zu testen und vorher noch die geraden und ein paar Sonderfälle:
#define TRUE 1 #define FALSE 0 int isPrime (unsigned int number) { unsigned int i; // 1 ist per Definition keine Primzahl. if (number == 1) return FALSE; // Primzahlen kleiner als 10 (bei denen funzt die sqrt-Variante nicht). if (number == 2 || number == 3 || number == 5 || number == 7) return TRUE; // Gerade Zahlen. if (number % 2 == 0) return FALSE; // Ungerade Zahlen. for (i = 3; i <= sqrt (number); i += 2) if (number % i == 0) return FALSE; return TRUE; }
-
Ja hmm so schön dass auch aussieht, nur in c1 glaub ich nicht dass ich
#define und sqrt verwenden kann.es soll sehr einfach sein das programm.
Also kann mir einer sagen was momentan noch falsch ist in meinen einfachen c1 programm?
-
C1 ???
Was ist das?
-
eine einfache Programmiersprache
-
Ich glaube hier kann keiner c1. Steht irgendwo eine Dokumentation zu c1? Mit normalem c kommt man hier scheinbar nicht weiter.
-
sqrt(number) braucht man nicht. number-1 oder number/2 gehen auch. sqrt ist nur schneller.
fast so schnell wie sqrt
for (i = 3; i <= sqrt (number); i += 2)
ist übrigens
for (i = 3; i*i <= number; i += 2)
-
brandi schrieb:
Ja hmm so schön dass auch aussieht, nur in c1 glaub ich nicht dass ich
#define und sqrt verwenden kann.es soll sehr einfach sein das programm.
Also kann mir einer sagen was momentan noch falsch ist in meinen einfachen c1 programm?Hat C1 keine Wurzelfunktion? Schreib doch eine selber, nach dem Heronverfahren z.B.
Gibts nen Link zur C1 Doku?