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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.