Le plus grand nombre en C

scanf("%d",&a); for(b=1;b<=a;++b) { c*=b; } printf("%lu",c); 

Je veux obtenir la réponse de 100!
factorial de 100. comment puis-je l’obtenir? (Je veux obtenir une plus grande gamme de nombres) Puis-je avoir la limite numérique à l’infini?

La plage entière maximale est, sur à peu près toutes les plateformes (modernes), 2^31 - 1 (bien que, par la norme, int ne soit obligatoirement que de 16 bits). Pour votre plate-forme donnée, il sera défini comme INT_MAX dans .

100! va évidemment dépasser de loin cela. Pour calculer quelque chose d’aussi grand en C , vous aurez besoin d’une grande bibliothèque de nombres entiers, telle que GMP .

Tout comme une mise en garde, si vous décidez d’utiliser un double (qui peut contenir des nombres de cette taille), vous obtiendrez une mauvaise réponse en raison d’une perte de précision. C’est facile à repérer – sur ma machine, les derniers chiffres sont 48 , ce qui est évidemment absurde: 100! doit être divisible par 100 et doit donc avoir 00 comme les deux derniers chiffres.

 #include  #include  #include  #if __STDC_VERSION__>=199901L #include  #else #define PRIu16 "hu" #endif typedef struct _unums { size_t size; uint16_t *nums;//array } UNums; void UNums_init(UNums *num, uint16_t n){ num->nums = (uint16_t*)malloc(sizeof(uint16_t)); num->nums[0] = n; num->size = 1; } void UNums_mul(UNums *num, uint16_t n){ uint16_t carry = 0; size_t i; for(i=0;isize;++i){ uint32_t wk = n; wk = wk * num->nums[i] + carry; num->nums[i] = wk % 10000; carry = wk / 10000; } if(carry){ num->size += 1; num->nums = (uint16_t*)realloc(num->nums, num->size * sizeof(uint16_t)); num->nums[i] = carry; } } void UNums_print(UNums *num){ size_t i = num->size; int w = 0; do{ --i; printf("%0*" PRIu16, w, num->nums[i]); if(!w) w = 4; }while(i!=0); } void UNum_drop(UNums *num){ free(num->nums); num->nums = NULL; } int main( void ){ UNums n; uint16_t i; UNums_init(&n, 1); for(i=2;i<=100;++i) UNums_mul(&n, i); UNums_print(&n);//100! UNum_drop(&n); return 0; } 

Pour les petits nombres, il vaut mieux utiliser unsigned long long que int . Mais vous avez toujours une limite sur le plus grand nombre que vous pouvez utiliser pour a . Vous pouvez essayer le double ou le float mais vous pourriez avoir une erreur de précession.