C Primzahltest

OP #4311798
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]
Gast #4311807
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.
Gast #4311822
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
}
Gast #4311907
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.
#4311938
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.
Angehängte Dateien:
Moderator #4311989
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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren