Forum: PC-Programmierung C Primzahltest


von Duc N. (anfang)


Lesenswert?

Hallo liebe Gemeinde,
wie ihr seht bin ich noch ein blutiger Anfänger.
Ich weiß nicht wo mein Fehler liegt .
Wenn ihr mir helfen würdet wäre ich sehr dankbar.

Es soll überprüft werden ob int nummer eine Primzahl ist .

Ich weiß ich bin schlecht aber daran arbeite ich ja .

1
#include <stdio.h>
2
#include <stdlib.h>
3
int main () {
4
int nummer=7; //ist diese nummer eine Primzahl?
5
int nummer2=1;
6
7
8
printf("Ist_%d_eine_Primzahl?\n",nummer);
9
10
for(nummer2;nummer2<nummer;nummer2++){ ////rechne für jede zahl die kleiner ist als nummer
11
12
if(((nummer2^nummer)-nummer2)%nummer==0){ //rechne für jede zahl die kleiner ist als nummer und wenn 0 rauskommt ist es prim 
13
printf("Ja");
14
15
}
16
else {
17
printf("Nein");
18
19
20
}
21
return 0;
22
}

[Mod: C-Tags eingefügt]

: Bearbeitet durch Moderator
von Compiler (Gast)


Lesenswert?

Du musst diese Zeilen in eine C-Datei speichern, z. B. "main.c". Dann 
durch einen Compiler jagen. Der meckert dir dann auch schon deinen 
Syntaxfehler mit der fehlenden geschweiften Klammer an. Dann gehts 
weiter.

von PittyJ (Gast)


Lesenswert?

Was soll das machen?
((nummer2^nummer)-nummer2)

Ich kenne ^ als bitweises exclusiv oder.

von Test (Gast)


Lesenswert?

Hier der Code mit etwas Ausgabe zur Fehlersuche.
Nur das return wurde noch verschoben.
1
#include <stdio.h>
2
#include <stdlib.h>
3
int main () {
4
  int nummer=7; //ist diese nummer eine Primzahl?
5
  int nummer2=1;
6
7
8
  printf("Ist_%d_eine_Primzahl?\n",nummer);
9
10
  for(nummer2;nummer2<nummer;nummer2++){ ////rechne für jede zahl die kleiner ist als nummer
11
  
12
    int n2 = nummer2;
13
    int n = nummer;
14
    printf("nummer2: %d, nummer: %d, n2^n: %d, (n2^n)-n: %d, ((n2^n)-n) mod n: %d\n", n2, n, n2^n, (n2^n)-n, ((n2^n)-n)%n);
15
16
    if(((nummer2^nummer)-nummer2)%nummer==0){ //rechne für jede zahl die kleiner ist als nummer und wenn 0 rauskommt ist es prim
17
      printf("Ja\n");
18
19
    }
20
    else {
21
      printf("Nein\n");
22
    }
23
  }
24
  return 0;
25
}

von mr. mo (Gast)


Lesenswert?

PittyJ schrieb:
> Was soll das machen?
> ((nummer2^nummer)-nummer2)
>
> Ich kenne ^ als bitweises exclusiv oder.

Klassiker. Hab ich bei meinen ersten C-Erfahrungen auch gemacht :) 
Immerhin hatte ich ein C-Buch nebenbei, welches mich korrigiert hat :)

von Gerald_B (Gast)


Lesenswert?

Kleiner Tipp: Ziehe aus deiner zu untersuchenden Zahl die Qudratwurzel 
(SQR) und gucke, ob die Teiler kleiner gleich der Wurzel bleiben. Ist 
diese Bedingung nicht mehr erfüllt, kannst Du die zu untersuchende Zahl 
um eins erhöhen. Das spart enormen Rechenaufwand, je größer die zu 
untersuchende Zahl wird ;-)
Z.B. Ist aus 100 die Wurzel 10 über 10x10 ist es somit sinnlos zu 
suchen.
Hatte das zu Zeiten der 8 Bit Heimcomputerära in BASIC geschrieben.

von Little B. (lil-b)


Angehängte Dateien:

Lesenswert?

Mein Prüfalorithmus sieht so aus:
1
uint8_t IsPrime (uint32_t TestNumber) {
2
   uint32_t counter = 3;
3
   
4
   // Testzahl ist durch zwei teilbar?
5
   if (TestNumber & 0x01 == 0) return 0;
6
   
7
   // jetzt alle ungeraden zahlen testen
8
   for (counter = 3; counter * counter <= TestNumber; couneter +=2) {
9
      if (TestNumber % counter == 0) return 0;
10
   }
11
   return 1;

was du mit
1
if(((nummer2^nummer)-nummer2)%nummer==0)
erreichen willst, ist mir nicht ganz schlüssig...


Anbei hängt mein Primzahlen-Benchmark-Programm, welches mit variabler 
Anzahln von Threads Primzahlen errechnet. Ist für Windows geschrieben.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Duc N. schrieb:
> if(((nummer2^nummer)-nummer2)%nummer==0){ //rechne für jede zahl die

Unter der Annahme, dass das "^" der Potenzoperator sein soll (was er in
C aber nicht ist):

Möchtest du wirklich prüfen, ob nummer prim ist?

Das Ganze sieht eher danach aus, als ob du prüfen wolltest, zu welchen
nummer2 < nummer die Zahl nummer eine Fermatsche Pseudoprimzahl
zur Basis nummer2 ist bzw. ob sie eine Carmichael-Zahl ist.

Aber auch dann musst du darauf achten, dass die Prüfung für nummer = 7
zwar noch problemlos funktioniert, aber schon für nummer ≥ 10
(32-Bit-Integer) bzw. für nummer ≥ 16 (64-Bit-Integer) die Berechnung
der Potenz

  nummer2 hoch nummer

zu einem Überlauf führt.

Wie genau lautet denn die Aufgabenstellung?

: Bearbeitet durch Moderator
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.