C中最大的数字

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

我想得到100的答案!
阶乘为100.我怎么能得到这个? (我想要获得更大范围的数字)我们是否可以将数量限制为无穷大?

几乎每个(现代)平台上的最大整数范围是2^31 - 1 (尽管按照标准, int只需要至少16位)。 对于您的给定平台,它将在定义为INT_MAX

100! 显然会远远超过这个。 要计算C这么大的东西,你需要一个大的整数库,比如GMP 。

正如警示一样,如果您决定尝试使用double (可以容纳此数量的数字),由于精度损失,您将得到错误的答案。 这很容易发现 – 在我的机器上,最后的数字是48 ,这显然是废话: 100! 必须可以被100整除,因此必须将00作为最后两位数。

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

对于小数字,最好使用unsigned long long不是int 。 但是你仍然限制你可以使用的最大数字。 您可以尝试doublefloat但您可能会遇到进动错误。