C Primzahltest

OP #4311798
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
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
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 #4311853
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 :)
Gast #4311907
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
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
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

Eine eigene Frage? Dieser Thread ist über 11 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.