Déterminer les Nombres premiers en utilisant un SEUL-lors de la Boucle
J'ai écrit ce programme de par mon professeur de l'enseignement. Il s'avère qu'il voulait que nous n'utiliser qu'un SEUL-lors de la boucle. Alors que je n'ai techniquement faire... ce ne sera pas volée. Je ne peux pas comprendre comment le faire sans l'aide d'une boucle for ou au moins une autre boucle d'un autre type. Il a dit qu'il pourrait utiliser continue
ou break
états--mais qu'il pourrait ne pas être nécessaire.
Je vous serais reconnaissant de ne pas ré-écrire mon code--bien que ce soit pratique, je n'ai pas apprendre de bien.
J'apprécie toute aide.
int main() {
int max, x, n = 2; //init variables
//start n at 2 because 1 isn't prime ever
//asks user for max value
printf("Enter max number: ");
scanf("%i", &max);
/*prints prime numbers while the max value
is greater than the number being checked*/
do {
x = 0; //using x as a flag
for (int i = 2; i <= (n / 2); i++) {
if ((n % i) == 0) {
x = 1;
break;
}
}
if (x == 0) //if n is prime, print it!
printf("%i\n", n);
n++; //increase number to check for prime-ness
} while (n < max);
return 0;
}
- Je ne vois pas comment cela peut être fait facilement avec une seule boucle. Cela impliquerait un algorithme O(1) pour la détermination de primalité. Pas une telle méthode est connue.
- Êtes-vous autorisé à utiliser si les déclarations?
- Je suppose que oui. Il n'a pas dit qu'on ne pouvait pas.
- Êtes-vous sûr que le programme doit imprimer tous les nombres premiers en dessous d'une certaine limite? Peut-être l'entrée est censé être un numéro unique qui est ensuite testé? Cela pourrait être fait facilement avec une seule boucle. Mais pas l'ancien!
- Je suis certain que c'est ce qu'il demande. Mon professeur est un peu ridicule quand il s'agit à notre connaissance de la C.-je trouver cette classe, plutôt facile -, mais ses trucs de ce genre qui me laisse de me gratter la tête.
Vous devez vous connecter pour publier un commentaire.
C'est certainement faisable. Le truc est d'avoir un test variable, et à chaque itération par le biais de votre boucle while, vérifier la test variable à l'encontre de votre numéro actuel. Toujours commencer la test variable à
2
(chaque nombre naturel > 0 est divisible par 1)Cas à considérer:
Je n'ai pas fourni le code que vous avez demandé de ne pas l'avoir ré-écrit, mais peut fournir si vous le souhaitez.
MODIFIER
De sortie:
do while
, et unif
,if else
etelse
Je ne vais pas vous donner le code exact, mais deux pointeurs qui devrait vous aider:
Tout d'abord, une boucle for peut être écrite comme une boucle while (et vice versa)
devient:
Deuxième, deux boucles imbriquées peuvent devenir un seul, dans un certain nombre de façons:
Devient
Ci-dessus montre deux boucles for, mais vous pouvez effectuer des transformations sur les autres boucles.
Pense crible d'ératosthène. Dans cette méthode nous permet de trouver des numéros composés d'une table, de sorte qu'à la fin que les nombres premiers de rester. Pour des raisons de simplicité, la table ne contient que des nombres impairs. Vous commencez pointage à 3, qui est un nombre premier. Grève de 3*3, 3*5... Terminer votre course sur la table (c'est fini), point 5. Il n'est pas barré, ainsi un nombre premier. Grève au lieu de 15, 25... case 7, le premier, une grève de 21, 35... case 9, déjà barré, déplacer à 11...
Questions:
Écrivez des réponses à ces questions, et vous avez une boucle le premier algorithme de recherche.