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.