ouverture de fichier en C

En faite, le deuxieme code n'est pas de moi, mais c'est vrai que je pourrais lui porter ces améliorations. Par contre, j'ai un peu de peine à comprendre le faite qu'il soit tellement plus rapide que le mien à l'execution.
 
HommeCocoa a dit:
En faite, le deuxieme code n'est pas de moi, mais c'est vrai que je pourrais lui porter ces améliorations. Par contre, j'ai un peu de peine à comprendre le faite qu'il soit tellement plus rapide que le mien à l'execution.

Toi tu recherches les nombres dont les seuls diviseurs sont 1 et lui-même, avec des divisions euclidiennes.
Lui recherche les nombres qui ne sont pas multiple d'un autre nombre, avec des additions uniquement:en gros il supprime de sa liste les multiples d'autres nombres.
Dans ton cas, tu fais de nombreuses divisions euclidiennes (calcul pas si simple) et dans son cas, il n'y a aucun calcul (ou presque). ;)
 
Didier Guillion a dit:
Bonjour,

Il y a une petite erreur dans ton exemple Tatouille :
Tu écrit :

sourceFile = fopen("file.c", "r");
destinationFile = fopen("file2.c", "w");

if(sourceFile==NULL)
{
printf("Error: can't access file.c.\n");
return 1;
}
else if(destinationFile==NULL) {
printf("Error: can't create file for writing.\n");
return 1;
}

Or si tu arrive a ouvrir la source et pas la destination, ta source reste ouverte et tu perd un descripteur de fichier. Comme le nombre de descripteur de fichier est limité (par session de la meme application) tu va saturer et au bout d'un moment plus aucun fichier ne pourra etre ouvert.
Ensuite le "else" ne sert a rien puisque le "return" rends la main a l'appelant.

Je prefererait donc :

sourceFile = fopen("file.c", "r");

if(sourceFile==NULL)
{
printf("Error: can't access file.c.\n");
return 1;
}
destinationFile = fopen("file2.c", "w");
if(destinationFile==NULL)
{
fclose(sourceFile); /* Je ferme le fichier source */
printf("Error: can't create file for writing.\n");
return 1;
}

Ensuite, plutot que de retourner (1) dans le cas d'une erreur, et (0) quand tout est bon, il pourrait etre intéressant d'utiliser "errno" qui donne un numéro d'erreur.

Cordialement

oui j'étais parti dans un truc j'ai viré des lignes rapidemment
pour simplifier

:D
 
Pour ce qui est de ton code moins optimisé :
celui de ton pote est la traduction de la méthode du crible d'Erathostène. C'est un code efficace mais qui nécesite la création d'une table qui à la taille du plus grand nombre premier à tester. Donc pas question de l'utiliser pour des tests de primalité sur des entiers > à 10^10 par exemple. Le principe est de cocher tous les multiples dans la table, puis on recommence. Les entiers qui restent sont ceux qui ne sont multiples d'aucun entier autre que 1, c'est à dire les premiers.

Si le tien est peu efficace en voici quelques raisons : si tu cherches les diviseurs d'un entier n tu peux te limiter à ceux inférieurs ou = à sqrt(n). En effet si n a des facteurs ? 1, et donc au moins deux facteurs, les deux sont inférieurs ou = à sqrt(n), sinon t'aurai un produit > à n.
De plus, quand par exemple 2 ne divise pas n, alors forcément 4 non plus : il faut donc éliminer les multiples de tes diviseurs qui échouent, ce qui devient très compliqué.

A propos de ton offre généreuse de table de 10 000 carrés sache qu'il vaut mieux éléver 10 000 nombres au carré qu'un seul enfant au biberon :D (c'est pas de moi, c'est d'Alphonse Allais).
 
arnolix a dit:
A propos de ton offre généreuse de table de 10 000 carrés sache qu'il vaut mieux éléver 10 000 nombres au carré qu'un seul enfant au biberon :D (c'est pas de moi, c'est d'Alphonse Allais).

:cool: je pensais pas que fopen ferait 2 pages :D

merde j'ai fait un x%2==1 :p :p :p