1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <gmp.h>
#define MAX 100000000000000 //cent mille milliards
#define STRLEN_MAX 15 //taille (en nombre de caractères) du nombre MAX
int CalculerEtTester(unsigned long long nb1, unsigned long long nb2);
int CalculerEtTesterDiagonaleBrique(unsigned long long nb1, unsigned long long nb2, unsigned long long nb3);
int main()
{
//Ouverture d'un fichier servant à enrtegistrer là où le programme s'était arrêté la dernière fois
FILE* fichier = NULL;
unsigned long long valeur = 0; //valeur indiquant là où programme s'étati arrêté
char str[STRLEN_MAX]; /*stoque la chaine de caractères correspondant au contenu du fichier*/
fichier = fopen("position.txt", "r");
if(fichier != NULL)
{
fgets(str, STRLEN_MAX, fichier);
valeur = strtoull(str, (char **)NULL, 10); //convertir la valeur en unsigned long long
}
else
valeur = 1;
fclose(fichier);
//trois valeurs correspondant aux arrêtes du parallelépipède
unsigned long long A;
unsigned long long B;
unsigned long long C;
for(A = valeur ; A < MAX ; A++)
{
//enregistrement d'où en est de programme dans le fichier
FILE* fichier = NULL;
char str[STRLEN_MAX];
fichier = fopen("position.txt", "w+");
sprintf(str, "%I64u", A);
fputs(str, fichier);
fclose(fichier);
for(B = A ; B < MAX ; B++)
{
if(CalculerEtTester(A, B)) //Si √(A² + B²) est un entier...
{
for(C = B ; C < MAX ; C++)
{
if(CalculerEtTester(B, C )&& CalculerEtTester(C, A) && CalculerEtTesterDiagonaleBrique(A, B, C))
printf("%I64u - %I64u - %I64u \n", A, B, C);
}
}
}
}
return 0;
}
int CalculerEtTester(unsigned long long nb1, unsigned long long nb2)
{
mpz_t puiss1;
mpz_t puiss2;
mpz_t res;
mpz_init(puiss1);
mpz_init(puiss2);
mpz_init(res);
mpz_ui_pow_ui(puiss1, nb1, 2);
mpz_ui_pow_ui(puiss2, nb2, 2);
mpz_add(res, puiss1, puiss2);
//gmp_printf("%Zd\n", res);
int boolean = mpz_perfect_square_p(res);
if (boolean)
return 1;
else
return 0;
}
int CalculerEtTesterDiagonaleBrique(unsigned long long nb1, unsigned long long nb2, unsigned long long nb3)
{
mpz_t puiss1;
mpz_t puiss2;
mpz_t puiss3;
mpz_t res;
mpz_init(puiss1);
mpz_init(puiss2);
mpz_init(puiss3);
mpz_init(res);
mpz_ui_pow_ui(puiss1, nb1, 2);
mpz_ui_pow_ui(puiss2, nb2, 2);
mpz_ui_pow_ui(puiss3, nb3, 2);
mpz_add(res, puiss1, puiss2);
mpz_add(res, res, puiss3);
int boolean = mpz_perfect_square_p(res);
if (boolean)
return 1;
else
return 0;
} |
Partager