C中的最大数 scanf(“%d”和&a); 对于(b=1;b
Max integer range,在几乎所有(现代)平台上,C中的最大数 scanf(“%d”和&a); 对于(b=1;b,c,C,Max integer range,在几乎所有(现代)平台上,2^31-1(尽管按照标准,int只要求至少为16位)。对于给定平台,它将在中定义为int\u Max 100!显然将远远超过此值。要在C中计算如此大的值,您需要一个大的整数库,例如 作为一个警告,如果您决定尝试使用一个双精度(可以容纳这种大小的数字),由于精度损失,您将得到错误的答案。这很容易发现-在我的机器上,最后的数字是48,这显然是胡说八道:100!必须可以被100整除,因此最后两个数字必须是00。对于小数字,最好使用无符号长
2^31-1
(尽管按照标准,int
只要求至少为16位)。对于给定平台,它将在
中定义为int\u Max
100!
显然将远远超过此值。要在C
中计算如此大的值,您需要一个大的整数库,例如
作为一个警告,如果您决定尝试使用一个
双精度
(可以容纳这种大小的数字),由于精度损失,您将得到错误的答案。这很容易发现-在我的机器上,最后的数字是48
,这显然是胡说八道:100!
必须可以被100整除,因此最后两个数字必须是00
。对于小数字,最好使用无符号长
而不是int
。但对a
可以使用的最大数字仍然有限制。您可以尝试double
或float
,但可能会出现进动错误。\include
scanf("%d",&a);
for(b=1;b<=a;++b)
{
c*=b;
}
printf("%lu",c);
#包括
#包括
#如果STDC版本=199901L
#包括
#否则
#定义PRIu16“hu”
#恩迪夫
类型定义结构{
大小;
uint16_t*nums;//数组
}联合国大学;
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\u mul(UNums*num,uint16\u n){
uint16_t进位=0;
尺寸i;
对于(i=0;isize;++i){
uint32_t wk=n;
wk=wk*num->nums[i]+进位;
num->nums[i]=wk%10000;
进位=wk/10000;
}
如果(携带){
num->size+=1;
num->nums=(uint16_t*)realloc(num->nums,num->size*sizeof(uint16_t));
num->nums[i]=进位;
}
}
作废UNums\U打印(UNums*num){
大小i=num->size;
int w=0;
做{
--一,;
printf(“%0*”PRIu16,w,num->nums[i]);
如果(!w)w=4;
}而(i!=0);
}
作废未使用的数据(未使用的*num){
自由(num->nums);
num->nums=NULL;
}
内部主(空){
联合国大学;
uint16_t i;
UNums_init(&n,1);
对于(i=2;i您可以使用
安装时使用:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#if __STDC_VERSION__>=199901L
#include <inttypes.h>
#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;i<num->size;++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;
}
主要条款c:
#包括
对于您的shell,void f()太大{
mpz_t n;//声明一个大n数
mpz_init_set_ui(n,0);//将0指定为起始值
马普斯提特酒店(n,1那么,c
和java
标记的意义是什么?假设你使用c,你可以阅读答案。在java中你可以使用java.math.biginger
。你不能有无限的整数范围,因为你的计算机没有无限的内存来存储它。100!=93326154439441526816992388562667004907159682643162146859 2963895217599932299156089414639767615651528625369792027223758251185210916864000000000000000000000000000000。我从BLUEPIXY答案中的代码中获得并验证了它。您实际上可以不使用GMP库来计算它。PostgreSQL支持无限制精度整数算法。确切值在这里:@mvp这与能够com有什么关系把它放在C
?你可以用Python、Lisp、Haskell、Java、C#来计算它。如果你只局限于C
,这一切都不意味着蹲。我只是玩得很开心。顺便说一句,PostgreSQL是用C编写的。因此,你可以从它的源代码中提取无限精度的函数。它实际上以000000000000000000000000000000000000000000000000000000000000000000000000000000000000结尾,这太糟糕了Visual Studio没有inttypes.hThanks!我让它工作了,我还必须对malloc和realloc函数进行类型转换。@raxman它将从C++
中编译而来。没有必要在C
中进行类型转换。但是我也被修复得很好。谢谢。哦,我明白了,这是一个严格意义上的C问题/答案。可爱的答案-谁说你不能在几行代码中获得大数值C
sudo apt-get install libgmp3-dev
gcc main.c -lgmp && ./a.out
???
profit, enjoy your 2^(2^24) number on stdout.