Garder un nombre toujours positif

Fermé
Arkolos - 14 déc. 2008 à 12:21
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 14 déc. 2008 à 18:34
Bonjour,
Je programme en C et je doit trouver le nompbre le plus proche d'un autre. Il faut pour cela faire une différence entre ces deux nombres, mais se débrouiller pour que le resultat obtenu soit toujours positif ou nul (pour calculer le plus bas).

Quelle est le moyen de faire cela le plus simplement et le plus rapidement pour le programme ?

J'ai fais dif=((nb-nombre[i]>0)-(nb-nombre[i<0))*(nb-nombre[i]);
mais je ne pense pas que ce soit le moyen le plus rapide...

Merci de me répondre

2 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
14 déc. 2008 à 12:50
Salut,
Tout dépend, si ton tableau est trié ou pas.
Les algorithmes ne sauront pas les mêmes suivant les cas.
0
Mon tableau est trié en ordre décroissant mais je ne voit pas ce que cela change...
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 844
14 déc. 2008 à 18:34
Mon tableau est trié en ordre décroissant mais je ne voit pas ce que cela change...
Ca change la complexité de l'algorithme.
Dans le cas du tableau non trié, tu dois parcourir tous les éléments, alors que pour le tableau tu n'as pas besoin d'aller jusqu'au dernier. Donc l'algorithme est plus performant. De plus, tu n'auras même pas besoin de calculer la valeur absolue.

Par exemple, dans ton cas, tu peux faire tout simplement :

#include <stdio.h>

double plusProche(double *tab, double nb, size_t len){
    size_t i=0;

    if( nb>tab[0] ) return tab[0];

    while( i<len && nb<tab[i++] );i--;

    return ( tab[i-1]-nb < nb-tab[i]) ? tab[i-1] : tab[i];
}

int main(void){
    double tab[]={1.5,1.3,1.2,1.1};
    double nb;

    puts("nombre :");
    scanf("%lf",&nb);

    printf("plus proche : %lf\n",plusProche(tab,nb,sizeof tab/sizeof *tab));
    return 0;
}


Si tu comprends pas mon algorithme, teste sur un exemple tu verras ;)
Sinon, n'hésite pas à poser des questions.

Cdlt
0