Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C中的最大数 scanf(“%d”和&a); 对于(b=1;b_C - Fatal编程技术网

C中的最大数 scanf(“%d”和&a); 对于(b=1;b

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。对于小数字,最好使用无符号长

Max integer range,在几乎所有(现代)平台上,
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.