El mayor número en C

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

Quiero obtener la respuesta de 100!
Factorial de 100. ¿Cómo puedo conseguir esto? (Quiero obtener un mayor rango de números) ¿No podemos tener el límite de números hasta el infinito?

El rango máximo de enteros es, en casi todas las plataformas (modernas), 2^31 - 1 (aunque, por norma, solo se requiere que int sea ​​de al menos 16 bits). Para su plataforma dada, se definirá como INT_MAX en .

100! obviamente va a superar mucho esto. Para calcular algo tan grande en C , necesitará una gran biblioteca de enteros, como GMP .

Solo como una nota de advertencia, si decide intentar usar un double (que puede contener números de este tamaño), obtendrá la respuesta incorrecta debido a la pérdida de precisión. Esto es fácil de detectar: ​​en mi máquina, los últimos dígitos son 48 , lo que obviamente es una tontería: 100! debe ser divisible por 100, por lo tanto debe tener 00 como los dos últimos dígitos.

 #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; } 

Para números pequeños, es mejor usar unsigned long long than int . Pero todavía tienes un límite en el número más grande que puedes usar para a . Podría intentar double o float pero podría obtener un error de precesión.