OK, oubliez C. Supposons que je vous donne un nombre et que je vous demande de déterminer s'il est premier. Comment vous y prenez-vous ? Écrivez clairement les étapes, puis se soucier de les traduire en code.
Une fois l'algorithme déterminé, il sera beaucoup plus facile pour vous de trouver comment écrire un programme, et pour les autres de vous aider.
éditer : Voici le code C# que vous avez posté :
static bool IsPrime(int number) {
for (int i = 2; i < number; i++) {
if (number % i == 0 && i != number) return false;
}
return true;
}
C'est très près C valide tel quel ; il n'y a pas de bool
en C, et aucun true
ou false
Il faut donc le modifier un peu (edit : Kristopher Johnson signale correctement que C99 a ajouté l'en-tête stdbool.h). Puisque certaines personnes n'ont pas accès à un environnement C99 (mais vous devriez en utiliser un !), faisons ce changement très mineur :
int IsPrime(int number) {
int i;
for (i=2; i<number; i++) {
if (number % i == 0 && i != number) return 0;
}
return 1;
}
C'est un programme C parfaitement valide qui fait ce que vous voulez. Nous pouvons l'améliorer un peu sans trop d'effort. Tout d'abord, notez que i
est toujours inférieur à number
donc la vérification que i != number
réussit toujours ; on peut s'en débarrasser.
De plus, vous n'avez pas besoin d'essayer des diviseurs jusqu'à number - 1
; vous pouvez arrêter de vérifier lorsque vous atteignez sqrt(nombre). Depuis sqrt
est une opération à virgule flottante et cela apporte tout un tas de subtilités, nous ne calculerons pas réellement sqrt(number)
. Au lieu de cela, nous pouvons simplement vérifier que i*i <= number
:
int IsPrime(int number) {
int i;
for (i=2; i*i<=number; i++) {
if (number % i == 0) return 0;
}
return 1;
}
Une dernière chose, cependant : il y avait un petit bug dans votre algorithme original ! Si number
est négatif, ou zéro, ou un, cette fonction affirmera que le nombre est premier. Vous voudrez probablement gérer cela correctement, et vous voudrez peut-être faire en sorte que la fonction number
sont non signées, car il est plus probable que vous ne vous souciiez que des valeurs positives :
int IsPrime(unsigned int number) {
if (number <= 1) return 0; // zero and one are not prime
unsigned int i;
for (i=2; i*i<=number; i++) {
if (number % i == 0) return 0;
}
return 1;
}
Ce n'est certainement pas la façon la plus rapide de vérifier si un nombre est premier, mais cela fonctionne, et c'est assez simple. Nous avons à peine eu à modifier votre code !
1 votes
Il s'agit davantage d'une question de mathématiques que de programmation, n'est-ce pas ?
51 votes
Voici quelques pointeurs : int *ptr ; int *ptr2 ; int *ptr3. Désolé, je n'ai pas pu m'en empêcher. Quelle est la taille des nombres que vous allez vérifier ? Et aussi, voulez-vous une heuristique ou quelque chose qui fonctionne toujours ?
3 votes
Présentez votre algorithme (de la manière dont vous le testez sans code) et ensuite nous pourrons peut-être vous aider à l'exprimer en C.
0 votes
Réfléchissez à un algorithme, essayez de le mettre en œuvre et si vous rencontrez un problème concret avec celui-ci, vous trouverez quelqu'un qui vous aidera. Vous ne pouvez pas vous attendre à ce que les autres fassent tous vos devoirs. De toute façon, il existe un moyen facile de trouver une solution : il suffit d'utiliser la fonction de recherche - si vous cherchez "prime", vous trouverez beaucoup de bonnes approches.
12 votes
Quel est l'intérêt de "i != nombre" lorsque vous avez "i < nombre" comme condition pour exécuter la boucle ?
0 votes
Jetez un coup d'œil à ce lien qui contient une explication de la façon dont les choses fonctionnent. cprogramming.language-tutorial.com/2012/01/
3 votes
Notez également que la vérification
i < number
est exagéré. Par définition, si un nombrex = a * b
soita
oub
est< int(sqrt(x))
et l'autre est plus grande. Donc votre boucle ne devrait avoir besoin que d'aller jusqu'àint(sqrt(x))
.