Traiter le dépassement numérique pour le sortingangle pascal

J’essaie de créer un grand sortingangle pascal pouvant imprimer jusqu’à 70 lignes. Mon code fonctionne bien au début, mais il a commencé à imprimer une sortie incorrecte lorsqu’il atteint la 65e ligne. Je connais le problème et j’ai essayé d’utiliser GMP. Malheureusement, le logiciel que j’utilise pour coder ne prend pas en charge GMP. Y a-t-il d’autres moyens de le faire sans utiliser GMP?

char str; int value; int pascal(int n) { for (int i = 1; i < n + 2; i++) { unsigned long number = 1; for (int j = 1; j < i + 1; j++) { if(j == i) { printf("%lu\n", number); } else { printf("%lu ", number); } number = (number * (i - j) / j); } } return 0; } 

Y a-t-il d’autres moyens de le faire sans utiliser GMP?

Le nombre entier nécessaire dépasse le calcul de base sur 64 bits pour former des nombres tels que 109069992321755544170 , un nombre de 67 bits avec plus de 64 bits de poids fort.

Bien que l’entier le plus large uintmax_t puisse répondre aux besoins mathématiques de plus de 64 bits, il ne s’agit généralement que de 64 bits.

long double souvent une assez bonne précision (seulement 64 bits sur ma plate-forme), mais cela n’est pas spécifié pour répondre aux besoins de l’OP et appelle les problèmes généralement rencontrés par les PF pour résoudre un problème d’ entier .

Heureusement, le calcul approfondi nécessaire n’est qu’une multiplication et une division. Une chaîne simple, bien que peu efficace, se multiplie et se divise pour répondre aux besoins.

 void ssortingng_mult(char *y, unsigned x) { size_t len = strlen(y); unsigned acc = 0; size_t i = len; while (i > 0) { i--; acc += (y[i] - '0') * x; y[i] = acc % 10 + '0'; acc /= 10; } while (acc) { memmove(&y[1], &y[0], ++len); y[0] = acc % 10 + '0'; acc /= 10; } } unsigned ssortingng_div(char *y, unsigned x) { size_t len = strlen(y); unsigned acc = 0; for (size_t i = 0; i < len; i++) { acc *= 10; acc += y[i] - '0'; y[i] = acc / x + '0'; acc %= x; } while (y[0] == '0' && len > 1) { memmove(&y[0], &y[1], len); len--; } return acc; } void pascal(unsigned n) { printf("%u: ", n); for (unsigned i = 1; i < n + 2; i++) { char s[100] = "1"; for (unsigned j = 1; j <= i; j++) { printf("%s ", s); string_mult(s, i - j); string_div(s, j); } printf("\n"); } } int main() { for (unsigned i = 0; i <= 70; i++) pascal(i); } 

Sortie

 ... 1 70 2415 54740 916895 12103014 131115985 1198774720 9440350920 65033528560 396704524216 2163842859360 10638894058520 47465835030320 193253756909160 721480692460864 2480089880334220 7877932561061640 23196134763125940 63484158299081520 161884603662657876 385439532530137800 858478958817125100 1791608261879217600 3508566179513467800 6455761770304780752 11173433833219812840 18208558839321176480 27963143931814663880 40498346384007444240 55347740058143507128 71416438784701299520 87038784768854708790 100226479430802391940 109069992321755544170 112186277816662845432 109069992321755544170 100226479430802391940 87038784768854708790 71416438784701299520 55347740058143507128 40498346384007444240 27963143931814663880 18208558839321176480 11173433833219812840 6455761770304780752 3508566179513467800 1791608261879217600 858478958817125100 385439532530137800 161884603662657876 63484158299081520 23196134763125940 7877932561061640 2480089880334220 721480692460864 193253756909160 47465835030320 10638894058520 2163842859360 396704524216 65033528560 9440350920 1198774720 131115985 12103014 916895 54740 2415 70 1 

Après un examen plus approfondi, un long double peut fonctionner, mais mes efforts ont échoué à pascal(69) .