IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Comment représenter cet entier ?


Sujet :

C

  1. #21
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Superne0 Voir le message
    J'aimerais étudier les restes sur ce nombre ... et j'arrive pas à trouver plus que ce que je j'ai pu lire sur la doc officielle
    Tu veux dire que tu cherches le reste de la division de ce nombre géant par un autre ?

    Comment faisais-tu à l'école primaire ?

    En prenant ton nombre géant en tant que chaîne de caractères et en extrayant petit à petit les morceaux qui vont coller avec ton diviseur, tu dois pouvoir trouver un algorithme qui te permettra de diviser tout le nombre, quelle que soit sa taille et celle de ton diviseur.

    Je prends juste le début du nombre : 1350664108...
    J'imagine que tu souhaites le diviser par un nombre premier (pas trop grand quand même) : 53
    Retournons en CM2 :
    1 / 53 --> Ca marche pas, je descend le 3
    13 / 53 --> Ca marche pas, je descend le 5
    135 /53 = 2 et il reste 29 ; je descend le 0
    290 / 53 = 5 et il reste 25 ; je descend le 6
    ...
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  2. #22
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Points : 53
    Points
    53
    Par défaut
    Ce qui m'embête dans cette solution, c'est que le programme devra faire une division avec reste pour tout les digits, tandis que ce que je veux modifier, c'est justement le diviseur ... avec cette solution ça me prend beaucoup, beaucoup plus de temps.
    Mais sinon je suis en train de chercher une solution avec GMP, mais je ne vois pas comment : j'ai déclaré l'entier (à 309 digits, voir mon premier post) en tant que mpz_t.
    Je n'oublie ni la librairie gmp, ni la commande de compilation, donc étrange.
    Aussi, à la ligne où je déclare le nombre, j'ai à la compilation :
    attention : l'argument vecteur SSE sans autorisation SSE modifie l'ABI

  3. #23
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 52
    Points : 66
    Points
    66
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Comment faisais-tu à l'école primaire ?
    Un peu lent...

    Poste ton code cela pourrai aider à comprendre l'erreur...


    Sinon ce que tu cherche ce sont des algo de "multi-précision". Pour en savoir plus => recherche google.

  4. #24
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Tu dois implémenter un nouveau de type de données c'est-à-dire une nouvelle manière de représenter des données. Tu peux faire ça à l'aide d'un tableau, une structure, un champ de bit, etc. mais le plus simple c'est de représenter les nombres directement sous forme de chaîne. L'avantage c'est que c'est la représentation la plus proche de ce que nous les humains utilisons donc très facile à manipuler. Le principal inconvénient c'est que ca bouffe pas mal de mémoire (un octet pour chaque chiffre !). J'ai fais une source relativement simple qui montre comment manipuler de très grand nombres en langage C : http://www.developpez.net/forums/sho...d.php?t=467267

  5. #25
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Points : 53
    Points
    53
    Par défaut
    Salut à tous,
    Greatns s'utilise comme une librairie quelconque ?

  6. #26
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 19
    Points : 21
    Points
    21
    Par défaut
    Si tu n'as pas de contrainte du langage tu peux aussi utiliser python qui accepte nativement ce genre d'entier "long". Sauf erreur de saisie, ce nombre est divisible par 3 donc non premier mais peut etre que ce n'est pas ca qui t'interesse ici.

  7. #27
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Points : 53
    Points
    53
    Par défaut
    Effectivement, ce qui m'interesse est bien l'étude des restes.
    je m'entête avec GMP, parce que je ne conaissais pas cette librairie avant, mais c'est vrai que même si j'arrive pas à résoudre mon prob, il y a pas mal de trucs intéressants ...
    Sinon, j'ai pas de contraintes de langages, donc je verrai avec Python ou Lisp si je n'y arrive vraiment pas avec GMP.
    Pas d'utilisateurs de GMP ici ?
    Parce que j'ai vraiment pas l'habitude d'utiliser ce genre de librairie, et j'ai une conaissance limité du C.

  8. #28
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut

    nous poster ton code qui ne fonctionne pas aurait évité 2 pages de discussion pour rien

    gmp est une librairie très bien faite, et c'est intéressant de savoir l'utiliser

  9. #29
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Points : 53
    Points
    53
    Par défaut
    Voici mon code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <stdio.h>
    #include <gmp.h>
     
    int mpz_t calcul(mpz_t a,mpz_t acc){
    	if((a%acc)==0){
    		gmp_printf("%Zd\n",acc);
    		return(acc);
    	}else{
    		gmp_printf("%Zd\n",acc);
    		gmp_return(calcul(a,acc+1));
    	}
    }
     
    int main(){
    	mpz_init(mpz_t a);
    	a = 1350664108659952233496032162788059699388814756056670275244851438515265106048595338339402871505719094417982072821644715513736804197039641917430464965892742562393410208643832021103729587257623585096431105640735015081875106765946292055636855294752135008528794163773285339061097054433499981115005697236890927563;
    	gmp_printf("%Zd\n",calcul(a,2));
    	gmp_return(0);
    }
    J'ai vraiment du mal avec la doc officielle de GMP

  10. #30
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    c'est quoi le problème avec ce code, compilation/edition des liens/execution???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mpz_init(mpz_t a);
    a = 1350664108659952233496032162788059699388814756056670275244851438515265106048595338339402871505719094417982072821644715513736804197039641917430464965892742562393410208643832021103729587257623585096431105640735015081875106765946292055636855294752135008528794163773285339061097054433499981115005697236890927563;
    je ne le sens pas trop, je n'ai pas regardé la doc mais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    mpz_t a;
    mpz_init(a);
    a = 1350664108659952233496032162788059699388814756056670275244851438515265106048595338339402871505719094417982072821644715513736804197039641917430464965892742562393410208643832021103729587257623585096431105640735015081875106765946292055636855294752135008528794163773285339061097054433499981115005697236890927563;
    me semble plus usuel
    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  11. #31
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Points : 53
    Points
    53
    Par défaut
    Le problème est à l'éxécution.
    En remplaçant par la nouvelle déclaration de l'entier, et en compilant avec l'option -lgmp, j'obtiens
    4: erreur: expected «=", «,", «;", «asm" or «__attribute__" before «calcul"
    17:6: attention : constante entière trop grande pour tenir dans son type
    In function «main":
    17: attention : integer constant is too large for «long" type
    17:erreur: incompatible types in assignment
    18: attention : implicit declaration of function «calcul"
    Il y aurait pas un malloc spécial relatif à GMP à faire, ou quelque chose du genre ... ?

  12. #32
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 724
    Points
    5 724
    Par défaut
    si tu as un lien vers la doc que tu utilises on peut regarder parce que pour l'instant

    GMP= Groupe de Métabolisme et Pharmacocinétique

    " Dis ce que tu veux qui insulte mon honneur car mon silence sera la réponse au mesquin.
    Je ne manque pas de réponse mais : il ne convient pas aux lions de répondre aux chiens ! " [Ash-Shafi'i ]

  13. #33
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 124
    Points : 53
    Points
    53
    Par défaut
    Oui c'est vrai que Google boycotte ce genre d'infos ...
    La doc se trouve ici
    Ce qui m'étonne est qu'il n'y a pas d'équivalent à mpz_t (qui déclare un entier relatif), pour déclarer un entier naturel (qui serait l'équivalent d'un unsigned avec GMP je pense)

  14. #34
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par hegros Voir le message
    si tu as un lien vers la doc que tu utilises on peut regarder parce que pour l'instant

    GMP= Groupe de Métabolisme et Pharmacocinétique

    Ou alors "Good Manufacturing Practice"!

    Plus sérieusement, la page officielle de GMP arrive en 3ème position dans ma recherche Google:

    http://www.google.ch/search?hl=fr&q=...e+Google&meta=

    ...et avant "Groupe de Métabolisme et Pharmacocinétique".

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  15. #35
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    le secret que je vais dévoiler est la fonction
    int mpz_set_str (mpz_t rop, char *str, int base)

    mpz_t n;
    mpz_init(n);
    mpz_set_str(n,"98798798749837498739873987439847398793874", 10);
    gmp_printf("%Zd", n);

  16. #36
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    C'est pas loin non plus avec greatns :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #include <stdio.h>
    #include <stdlib.h>
    #include "greatns.h"
     
    int main()
    {
        char * a = "1234567890", * b = "9876543210", * somme;
     
        somme = gns_addi(a, b);
        if (somme != NULL)
        {
             printf("%s + %s = %s\n", a, b, somme);
             free(somme);
        }
        else
             printf("erreur.\n\n");
     
        return 0;
    }

  17. #37
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    salut, c'est plutôt pauvre par rapport à gmp greatns !

  18. #38
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Pauvre dans quel sens? Dans tous les cas c'est plutôt normal vu que j'ai pas que ça à faire. Mais si tu remarques bien j'ai pris le soin de nommer les fonctions "opérations" gns_addi, gns_multi, etc. ce n'est pas par hasard : c'est i pour int (en fait ici c'est unsigned int mais bref). C'est très facile d'implémenter un gns_addf, gns_multf (f pour flottant ) à l'aide des fonctions **i étant donné que les calculs sur flottants se font de la même manière que les calculs sur entiers sauf qu'il faut bien aligner le point décimal. Ensuite, on peut se faire toutes les opérations et les fonctions qu'on veut à l'aide de l'addition et la multiplication. En fait, si on veut optimiser on va plutôt recoder chaque fonction mais en partant chaque fois de morceaux de codes déjà existant. Ensuite, si on embarque ça dans un intérpréteur d'expressions mathématiques (comme celui que j'ai fait par exemple), ça donne ... une arme fatale.

  19. #39
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Citation Envoyé par Okdokey Voir le message
    Si tu n'as pas de contrainte du langage tu peux aussi utiliser python qui accepte nativement ce genre d'entier "long".
    Je pense que Lisp, Scheme ou Haskell traitent très bien ce genre de problème aussi.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  20. #40
    Membre averti

    Profil pro
    Étudiant
    Inscrit en
    Décembre 2004
    Messages
    499
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2004
    Messages : 499
    Points : 422
    Points
    422
    Par défaut
    pour greatns il reste la multiplication par fft à implémenter !

Discussions similaires

  1. Réponses: 10
    Dernier message: 23/02/2006, 11h10
  2. représentation binaire-->entier
    Par felicity dans le forum C
    Réponses: 6
    Dernier message: 17/01/2006, 20h57
  3. [C#] Comment convertir un entier en couleur ?
    Par L`artiste dans le forum C#
    Réponses: 3
    Dernier message: 08/01/2006, 20h52
  4. Comment arrondir à l'entier supérieur ?
    Par kuranes dans le forum Access
    Réponses: 3
    Dernier message: 29/11/2005, 17h42
  5. [Séquence] Comment représenter les cas/messages d'erreur ?
    Par joker34 dans le forum Autres Diagrammes
    Réponses: 4
    Dernier message: 27/07/2005, 04h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo