4 Réponses :
L'instruction if (a == j) se trouve en dehors de la boucle for (j = 2; ...) imbriquée et j n'est pas initialisée à l'extérieur de la boucle for. alors comment la condition * if * est-elle testée?
"j" est déclaré en dehors de la première boucle. Ce qui signifie que sa portée est l'ensemble de la fonction principale après ce point. C'est pourquoi
if(a==j) printf("- it is a prime number ");mettra "j" à deux et s'exécutera, jusqu'à ce que "j" ne soit pas inférieur (signifiant: égal ou supérieur) à "a" plus OU "a "est divisible par" j "(" a% j == 0 "signifie: Il n'y a pas de reste après la division; le" break; "par la suite sortira prématurément de la boucle for)
Donc .. . après cette boucle: "j" est soit un facteur de "a" OU son "a" lui-même.
for(j=2;j<a;j++) { if(a%j==0) break; }Et UNIQUEMENT si a est égal à j ... THAN a est un nombre premier. Parce que sinon, a serait un facteur de j et non un lui-même.
Salut, tout d'abord merci. D'après ce que je sais, "break" vous quitte une boucle ryt? il devrait donc quitter prématurément la boucle 2nd for . Mais, if(a==j) est à l'intérieur de la 1er "for" boucle ryt. Donc même si la 2ème boucle "for" {for (j = 2; j rencontre "break" i > . la fonction "printf" après if(a==j) doit s'exécuter à chaque fois. Mais ce n'est pas pourquoi?
La variable j est définie à l'extérieur. Donc, il a déclaré mais pas initialisé. Lorsque votre boucle interne initialise j, sa valeur est définie et après la boucle, sa valeur sera celle incrémentée. Comme vous le savez, le nombre premier n'est divisible que par 1 et le nombre lui-même. La boucle interne vérifie que si le nombre est divisible par tout autre nombre plus petit que lui-même. Si aucun nombre n'est trouvé, la valeur j après la fin de la boucle devient a. Il vérifiera alors si a == j, donc prime.
Vous pouvez maintenant comprendre votre deuxième code et l'erreur.
Profitez du codage!
Merci. Mais le fait est que la boucle interne *** for *** continuera à vérifier si a%j==0 jusqu'à j ; disons que pour a=5 , la boucle for vérifiera j = 2 , 3,4 . puisque a%j==0 n'est pas vrai pour a=5 il ne rencontrera pas casser et terminer prématurément, n'est-ce pas? Donc a = 5 et b = 4 et comme ils ne sont pas égaux, printf ne doit pas s'exécuter. Pouvez-vous expliquer comment ça marche?
#include <stdio.h>
void main ( )
{
// a, b, and c are the first terms of the fibonacci sequence
long a = 0, b = 1, c, n = 8;
int i,j;
printf("the fibonnaci series is:\n ");
// Prints the first term of the fibonnaci sequence
printf(" 0");
// This for loop reads numbers from i to n,
// which is i = 1 upto n = 8
for (i=1; i<n; i++)
{
/* This is the updating to the variables
for the next terms of the fibonnaci sequence */
c=a+b;
a=b;
b=c;
/* This is printing the current term
in the fibonnaci sequence which is a */
printf ("\n %ld",a);
// This loops reads each of the numbers til a - 1
for(j=2;j<a;j++)
{
/* Then, checking if a is divisible by j
And if it is, break from the loop
The modulo operator (%) gets the remainder of a divided by j */
if(a%j==0)
break;
}
/* This is checking if a and j is equal.
a and j will onle be equal if and only if the
for loop finished without entering
the if statement ---- > if(a % j == 0) which
signifies that a is a prime number
*/
if(a==j)
printf("- it is a prime number ");
}
getch();
}
I hope this helps you understand that the statement if (a == j) is not part of the for loop but rather helps in checking if (a % j == 0) ever become True.
Merci. Mais j'avais encore plus de question. "break" est dans la boucle "for (j = 2; j
Désolé pour la réponse tardive. :RÉ. N'oubliez pas que la 2ème boucle imbriquée se terminera de deux manières, soit 1. elle a entré le
if (a% j == 0) exécutant ainsi le break , soit 2 . terminer la boucle, ce qui rend la valeur de j égale à a . Désolé pour la réponse tardive. Je pense que l'explication est mieux exprimée par @ ex-nihilo. :RÉ
L'instruction
if (a == j)se trouve en dehors de la boucle imbriquéefor (j = 2; ...)etj n'est pas initialisé en dehors de la boucle for ....Dans le premier code publié,
ja une portée de bloc dansmain (). Avecfor (j = 2; j une valeur initiale de 2 est affectée àj, et la valeur dejest incrémenté après l'exécution du corps de la boucle jusqu'à ce quej (c'est-à-dire jusqu'àj == a). Une fois la boucle terminée, la valeur dejreste la même que lors de la fin de la boucle, carja une portée de bloc.La situation serait différent si
jétait défini dans la boucle. C99 a ajouté la portée des blocs comme option pour la partie déclaration d'une instruction d'itération:for (j = 2; j < a; j++) { if ((a % j != 0) && (j == a)) { printf("it is a prime number"); }Dans ce cas, le
jdéfini dans lepourinstruction ombres lejdéfini dansmain (), donc après la sortie de la boucle lejutilisé dans le corps de la boucle n'est plus accessible. Ici(a == j)est en dehors du bloc associé à l'instructionfor, etjfait maintenant référence à celui défini avecint j = 0.Deuxièmement, quelqu'un peut-il expliquer la fonction de
breakici.Un nombre premier n'est divisible que par lui-même et 1. Dans le corps de la boucle,
jest un entier qui est au moins 2 et inférieur àa code >. Si(a% j) == 0alorsjdivisea, doncan'est pas premier, et le boucle est quittée.D'un commentaire sous une autre réponse :
Pour
a= 5, la boucleforvérifieraj = 2,3,4. Puisquea% j == 0n'est pas vrai poura= 5, il ne rencontrera pasbreaket ne se terminera pas prématurément, n'est-ce pas? Donca= 5 etb= 4 et comme ils ne sont pas égaux,printfne devrait pas s'exécuter.La boucle itère pendant que
j . Tant que(a% j)! = 0, la boucle continue jusqu'à l'itération suivante, incrémentant la valeur dej. Lorsquej == a, le testj échoue et la boucle est quittée. Après la boucle, il y a deux raisons pour lesquelles la boucle a pu se terminer.1)
breaka été rencontré lorsque le test(a% j) == 0 code> était satisfait;jest un diviseur deaqui est à la fois inférieur àaet supérieur à 1: cela indique queaest pas prime.2) La boucle a suivi son cours, se terminant lorsque la valeur de
jatteinta. Le test post-boucleif (a == j) {/*...*/}teste cette condition. Sia == japrès la fin de l'exécution de la boucle, aucun diviseur autre quealui-même n'a été trouvé poura, donca est premier.Nous pouvons maintenant apprécier le problème fondamental dans le deuxième code posté:
int main(void) { int a = 5; int j = 0; for (int j = 2; j < a; j++) { if (a % j == 0) break; } if (a == j) { printf("%d is prime\n", a); } return 0; }Ici l'expression
(a% j! = 0) && (j == a)ne peut jamais être vrai, puisquejdoit toujours être inférieur àadans le corps de la boucle. Chaque fois quej == aen haut de la boucle, la boucle est quittée. C'est pourquoi le premier code testé pourj == aaprès la boucle est sortie.