Bibliothèque GMP
Résolu
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonsoir,
Je viens d'installer la bibliothèque GMP sur CodeBlocks.
J'ai créer un programme en C listant les nombres parfaits, mais on arrive rapidement à de très grands nombres.
Comment puis-je utiliser cette bibliothèque pour pouvoir afficher les grands nombres tels qu'ils le sont ? Je n'ai aucune idée de comment m'en servir.
Voici mon code :
Merci,
--
<\EchoIsON>
Je viens d'installer la bibliothèque GMP sur CodeBlocks.
J'ai créer un programme en C listant les nombres parfaits, mais on arrive rapidement à de très grands nombres.
Comment puis-je utiliser cette bibliothèque pour pouvoir afficher les grands nombres tels qu'ils le sont ? Je n'ai aucune idée de comment m'en servir.
Voici mon code :
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <gmp.h>
#define P 35
typedef enum
{False = 0, True = 1}
Bool;
long long int powInt(long long int base, long long int exp)
{
long long res = 1;
for(long long int i = 0 ; i < exp ; i++)
res *= base;
return res;
}
int main()
{
long long int n, la;
long long int p = P;
Bool test = True;
printf("6\n");
for(n = 3; n <= p; n+=2)
{
test = True;
long long int j;
long long int carre = (powInt(2, n)-1);
for(j = 2; j*j <= carre; j++)
{
if(carre % j == 0)
{
test = False;
break;
}
}
if(test)
{
la = powInt(2, n-1)*(powInt(2,n)-1);
printf("%lld\n", la);
}
}
return 0;
}
Merci,
--
<\EchoIsON>
1 réponse
-
-
Bonjour,
Merci, j'ai essayé d'adapter les exemples à mon problème mais mon programme crash directement :
#include <stdio.h> #include <stdlib.h> #include <math.h> #include <gmp.h> #define P 100 typedef enum {False = 0, True = 1} Bool; long long int powInt(long long int base, long long int exp) { long long res = 1; for(long long int i = 0 ; i < exp ; i++) res *= base; return res; } int main() { long long int n; mpz_t la; mpz_t one, two; mpz_init(la); long long int p = P; Bool test = True; printf("6\n"); for(n = 3; n <= p; n+=2) { test = True; long long int j; long long int carre = (powInt(2, n)-1); for(j = 2; j*j <= carre; j++) { if(carre % j == 0) { test = False; break; } } if(test) { mpz_set_ui(one, powInt(2, n-1)); mpz_set_ui(two, powInt(2,n)-1); mpz_mul_si(la, one, two); gmp_printf("%Zd\n", la); } } return 0; } -
-
-
Dans ta boucle for c'est des int simples que tu dois garder. Jamais tu ne feras des puissances supérieures à deux milliards.
Par contre le calcul res *= base devrait être en mpz_t car cette valeur peut rapidement exploser et dépasser.
Remarque : il y a plus malin qu'une boucle for pour calculer la puissance (en calculant avec des grands nombres tu verras que même les algos les plus simples doivent être optimisés) -
Bonsoir.
Ce problème est résolu, je vous remercie pour votre aide.
Néamoins j'ai un autre soucis, j'aimerais déclarer une variable de type string ou char avec GMP, pour ensuite la renvoyer en sortie vers un fichier texte avecmpz_out_str();
Cependant lorsque je déclare par exemplempz_t texte; mpz_init(texte); mpz_set_str(texte, "\n", 10);
puis*FILE fichier; fichier = fopen("test.txt", "a"); mpz_out_str(fichier, 10, texte);
J'aimerais que la touche entrée soit insérée dans mon fichier texte.
Or au lieu de l'entrée, des nombres sont affichés à la place, et généralement toujours les mêmes (quelque chose comme 82124573214).
Comment est-ce-que je peux faire pour simplement afficher l'entrée dans mon fichier texte ? (sans passer parfwrite
, sinon mon programme crash).
A mon avis c'est à cause de la base 10 non ?
Merci
-