Wie überprüft man in C, ob eine Zahl eine Primzahl ist?

6 Antworten

Man prüft ganz einfach ob die übergebene Zahl nur durch sich selbst und durch 1 teilbar ist. Das bekommst du sicher ganz einfach hin.

Hier nochmal eine optimierte Version des Primzahltests als Funktion in C:

#include <math.h>

typedef enum { false, true } bool;

bool isPrime(long n) {
if(n == 1)
return false;

else if(n == 2)
return true;

else {
long i, r = (long) sqrt(n);

for(i = 2; i <= r && n % i != 0; ++i);

return (r == i - 1) ? true : false;
}
}

Grüße - bormolino

Woher ich das weiß:Studium / Ausbildung – Studium Informatik und Hobby seit einigen Jahren

Du kannst dir im Prinzip alle Primzahlen bis zu deiner Zahl bilden.

Die Zahlen 2 und 3 schreibst du einfach in den Code rein.

Dann schreibst du folgendes:


int i;
char isPrime;
for(i = 5; i <= gesuchteZahl; i = i+2)
{
isPrime = 1;
for(alle gefundenen Primzahlen, außer 2)
{
if((i % Primzahl) == 0)
{
//i ist keine Primzahl
isPrime = 0;
break;
}
}
if(isPrime)
{
i zu den gefunden Primzahlen dazu geben
}
}

Wenn am Ende, diese Algorithmus deine Zahl bei den gefundenen Primzahlen steht, sprich am letzten Platz deines Arrays ist deine Zahl eine Primzahlen.

Basieren tut der Algorithmus auf der mindestdistanz aller von aller Primzahlen >= 3 diese ist nämlich mindestens 2 (vielleicht auch größer, aber das ist eine einfache untere Schranke), darum inkrementiert man immer um 2.

Das suchen ob es sich bei i nun um einen Primzahl handelt, basiert auf der Primfaktorzerlegung, jede Zahl ist nämlich durch eine Multiplikation von Primzahlen darstellbar und damit auch durch mindestens eine kleinere Primzahl ganzzeilig Teilbar.

AusgegebeneZahl ist schon das Ergebnis einer Division; du prüfst später noch mal, ob der Rest einer Division 0 ist.

Wenn eine Zahl n durch eine andere Zahl k teilbar ist, hat das nichts damit zu tun, ob n auch durch (n-k) teilbar ist.

(Übrigens reicht es, zu prüfen, bis Quotient < Divisor)

Woher ich das weiß:Berufserfahrung – Software-Entwickler

1. ) ganz einfach AusgabeZahl % counter ist bei counter = 1 immer wahr.

2.) sie sollten die Funktion verlassen, wenn sie einen Teiler gefunden haben.

3.) Ihre Schleife sollte von 2 beginnen und so lange gehen bis das qudrat größer als die eingabezahl ist.

 
for( int i = 2 ; i*i <= eingabezahl ; i++ )
if( eingabezahl % i == 0 )
{
printf("Zahl %i ist durch %i teilbar.",eingabezahl,i);
return 0;
}

printf("Zahl %i ist prim.",eingabezahl);
jadaniil  01.05.2020, 21:39

wie kommst du bei dem for auf "i*i <= eingabezahl", wieso bitte i mal i????(schon klar wegen Punkt 3)"bis Quadrat größer als Eingabezahl", aber wie kommst du bitte darauf?)
Und würde das zweite Printf bei einer hohen Primzahl nicht ewig oft immer wieder drankommen und unnötig oft in den Compiler ausgegeben?

0

Du könntest es umständlich machen, alle Zahlen durchgehen, sie teilen, und darauf achten, ob Nachkommazahlen herauskommen..