Primzahl-Programm
Ich möchte ein Programm in C-Sprache, die der Benutzer Eingangs-und ich wäre nicht in der Lage zu verstehen, die Logik der Schleife.
for ( c = 2 ; c <= n - 1 ; c++ )
Den Programm-code ist unten angegeben:-
#include<stdio.h>
#include<conio.h>
void main()
{
int n, c;
printf("Enter a number to check if it is prime\n");
scanf("%d", &n);
for ( c = 2 ; c <= n - 1 ; c++ )
{
if ( n % c == 0 )
{
printf("%d is not prime.\n", n);
break;
}
}
if ( c == n )
printf("%d is prime.\n", n);
getch();
}
Habe ich die for-Schleife, die am Ende die Aussage von n - 1
in der for-Schleife. Wenn ich gebe die Eingabe 11
dann wird es am Ende auf 11 - 1 = 10
dann, wie es geben wird, bis die Logik der if(c == n) { printf("%d", n);
?
- versuchen Sie schrittweise, mit einem debugger zu sehen, wo Sie gemacht haben, eine falsche Annahme
- Fragen Sie, wie das Programm funktioniert? Ich bin verwirrt, wusste nicht, Sie schreiben es selbst?
- Schauen Sie bitte auf Stack Overflow.
- wie kann ich den transfer dieser Frage auf stack overflow ich bin nicht sehr fimilar mit dieser Website bitte guide mich. dies ist der Algorithmus, den ich geschrieben habe, es ist nicht von mir geschrieben. die Wahrheit ist, dass ich nicht in der Lage wäre, zu verstehen, die Logik der Primzahlen in c ..
- Sie können die Flagge und es für die Moderatorin Aufmerksamkeit, oder wird die community migrieren, wenn wir kommen 5 Stimmen
- Eine Primzahl (oder prim) ist eine Natürliche Zahl größer als 1, die keine positiven Teiler außer 1 und sich selbst. So Ihr
for
Schleife ist die überprüfung von 2 (welches größer ist als 1)n-1
(das ist nur weniger als actal-Nummer) und da dieser loop-Wert vonc
erreichen bis zu eingegebenen Zahl, wenn und nur wenn eingegeben Zahl eine Primzahl ist sonst hätte esbreak
dazwischen. - Ich denke, es ist genug, wenn c läuft bis n/2
- Es ist.
- Eigentlich reicht es, zu testen, bis `√n' B. Sharon spitz aus.
- überprüfen Sie geschrieben Antwort nicht verstehen, Sie scheint off-line, aber die Frage ist nur 56min alt!!!
- Probieren Sie zuerst google Fragen, wenn Sie nicht bekommen, die Antwort dann hierher zu kommen. Einige Anstrengung von sich selbst zuerst.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nun richtig verstehe deine for-Schleife Bedingung:
Laut for-Schleife Bedingung
c <= n - 1
, Schleife bricht, wennc
Wert wird gleichn
. Also, wennn
ist gleich11
Schleifenbedingung wahr ist fürc = 2
zuc = 10
, in jeder iterationc
Schritten durch eine (mitc++
Inkrement), wennc
wird11
(ot sagenn
), dann Zustandc <= n - 1
werden zu false und die Schleife bricht.In der if-Bedingung (nach for-Schleife)
c
Wert im Vergleich mitn
. das heißt:für
n
=11
wird es undc
=11
if-Bedingung wahr und derprintf()
im Zusammenhang mit wenn führt.Es ist auch wichtig zu verstehen, dass die for-Schleife beendet nur für
c = n
wennn
ist eine Primzahl, aber wenn angenommenn
ist eine nicht-prime Zahl, dann for-Schleife bricht fürc
Wert von weniger alsn - 1
aufgrundbreak;
- Anweisung in verschachteltenif
block in die for-Schleife.Zum Beispiel, wenn
n = 8
dann in der ersten iteration der for-Schleife mit dem Wertc = 2
if-Bedingungif(n % c == 0)
auswertet alsif(8 % 2 == 0)
==if( 0 == 0)
= True undbreak;
- Anweisung innerhalb der if-block bewegt die Kontrolle außerhalb der for-Schleife(siehe Abbildung).Weil diese Zeit für die Schleife nicht beendet, aufgrund
c <= n - 1
Zustand, aber gebremst, weil derif(n % c == 0)
so aus-Seite for-Schleifec
Wert ist weniger alsn
daherif (c == n)
als False ausgewertet wird.n = 8
Schleife beendet aufgrundbreaks;
Anweisung inif
(dieif
in der for-Schleife) Sehen fürn = 8
im ersten iteration der for-Schleife, wennc = 2
die for-Schleife Bedingungc <= n - 1
ist(2 <= 7)
wird zu True ausgewertet, und, wenn die Bedingung( n % c == 0 )
ist8 % 2 == 0
wieder Wahr also, wenn-block wird ausgeführt, und nachprintf("%d is not prime.\n", n);
break-Anweisung beendet die for-Schleife.Die for-Schleife Schleifen von
c = 2
zuc = n - 1
außer es trifft diebreak
- Anweisung. Wenn es das tut, springt er aus der Schleife. Wenn Sie nie brechen dann Ihrec
tatsächlichn
nach der Schleife.Und hier ist warum. Die Schleife funktioniert wie folgt:
c = 2
(c <= n - 1)
wenn das stimmt: ausführen der Schleife
wenn false: Sprung vorbei loop
c
durch eineBeispiel: Angenommen, Ihr
n
3.c
2, jetztc == 2
undn == 3
2 <= 3 - 1
wahr ist, so dass der schleifenrumpf wird ausgeführt,c == 3
undn == 3
3 <= 3 - 1
ist false, so dass wir nicht, führen Sie die Schleife jetzt und springen aus der Schleifec == 3
undn == 3
soc == n
Also, wenn wir nie auf die break-Anweisung
c
wird gleichn
nach der Schleife. Wir schlagen die break-Anweisung wenn n ist nicht prim. Wenn wir Pausec
verpassen mindestens um eine Stufe erhöhen und damitc < n
nach der Schleife. Jetztc == n
wertet auf "false" und die if-Anweisungen Körperif ( c == n )
wird nicht ausgeführt.Nun zu den
if ( n%c == 0 )
.n%c
bedeutetn
moduloc
, also den Rest der division vonn
durchc
. Falls dieser Rest 0 ist dannc
ist ein ganzzahliger Teiler vonn
. Also in der Schleife, die Sie testenn
für alle Teiler, die größer als 1 und kleiner alsn
.Wenn es ein Teiler von
n
außer 1 und sich selbst,n
kann nicht prim sein. Also, wenn Sie auf eine beliebigec
mit1 < c < n
machtn%c
gleich 0n
kann nicht prim sein.Hinweis: Sie müssen nicht testen Teiler größer als
√n
.Ihre Annahme, dass
c
endet alsn - 1
ist falsche. Wenn Sie Schritt für Schritt durch dein Programm mit dem debugger sollte man sehen, dass fürn == 11
,c == 11
am Ende der Schleife.Wenn wir nicht brechen früh dann das Letzte mal die Schleife ausgeführt wird, in der Tat, wenn
c == n - 1
jedochc
wird dann um eins inkrementiert, und die Schleife-Invarianten test schlägt fehl, also nach der Schleifec == n
.Überlegen, was es bedeutet, wenn Sie sagen, dass eine Zahl eine Primzahl ist.
Eine Zahl p ist eine Primzahl, wenn für jede
n>1, n<p
, der Restr = 0
fürp/n = r
.So, diese Schleife läuft durch jeden Wert (c) der Bereich
[2..p-1]
, die Prüfung für den Rest.Eher als test, dass die Zahl eine Primzahl ist, indem Sie einen Nebeneffekt, der Schleifenzähler, warum nicht ein flag setzen, bevor die Schleife, und dann zu testen, wie die Entscheidung für prime am Ende? Das Ergebnis ist code, ist weniger zerbrechlich, fehleranfällig und übersichtlicher.
Speichern möchten, etwa die Hälfte der Arbeit? Sobald Sie den test
n%2
wir wissen, dass es gibt keine Zahl k, so dassk*2=n
, richtig? so überprüfen Sie den Bereich[2..p/2]
, und ändern Sie Ihre Schleife,Können, denken Sie sich eine Zahl kleiner als
n/2
funktioniert?Einen interessanten Algorithmus für die Suche nach mehreren Primzahlen ist die Sieb des Erastosthenes.