Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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/asp.net-mvc/15.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 中止陷阱:6(计算长数阶乘)_C_Factorial - Fatal编程技术网

C 中止陷阱:6(计算长数阶乘)

C 中止陷阱:6(计算长数阶乘),c,factorial,C,Factorial,我遵循下面的函数来计算大数的阶乘,我想进一步了解一些事情发生的原因 #include<stdio.h> #define MAX 10000 void factorialof(int); void multiply(int); int length = 0; int fact[MAX]; int main(){ int num; int i; printf("Enter any integer number : "); scanf

我遵循下面的函数来计算大数的阶乘,我想进一步了解一些事情发生的原因

#include<stdio.h>
#define MAX 10000
void factorialof(int);
void multiply(int);
int length = 0;
int fact[MAX];

int main(){
    int num;
    int i;

    printf("Enter any integer number : ");
    scanf("%d",&num);
   
    fact[0]=1;

    factorialof(num);
   
    printf("Factorial is : ");
    for(i=length;i>=0;i--){
         printf("%d",fact[i]);
    }
    return 0;
}

void factorialof(int num){
    int i;
    for(i=2;i<=num;i++){
         multiply(i);
    }
}
void multiply(int num){
    long i,r=0;
    int arr[MAX];
    for(i=0;i<=length;i++){
                arr[i]=fact[i];
        }

    for(i=0;i<=length;i++){
         fact[i] = (arr[i]*num + r)%10;
         r = (arr[i]*num + r)/10;
         //printf("%d ",r);
    }
    if(r!=0){
         while(r!=0){
             fact[i]=r%10;
             r= r/10;
             i++;
         }
    }
    length = i-1;   
}
#包括
#定义最大10000
无效因子alof(int);
无效乘法(int);
整数长度=0;
整数事实[MAX];
int main(){
int-num;
int i;
printf(“输入任意整数:”);
scanf(“%d”和&num);
事实[0]=1;
factorialof(num);
printf(“阶乘为:”);
对于(i=长度;i>=0;i--){
printf(“%d”,事实[i]);
}
返回0;
}
void factorialof(int num){
int i;
对于(i=2;i
  • MAX是
    fact
    arr
    中的元素数;尝试访问索引>=MAX的元素将是错误的
  • 错误消息通常特定于您正在使用的环境,您没有提供详细信息
  • 它们并不相同,但差异(例如,指针的大小)不应以任何明显的方式影响此代码
  • MAX是
    fact
    arr
    中的元素数;尝试访问索引>=MAX的元素将是错误的
  • 错误消息通常特定于您正在使用的环境,您没有提供详细信息
  • 它们并不相同,但差异(例如,指针的大小)不应以任何明显的方式影响此代码

  • 正如Scott Hunter所指出的,
    MAX
    fact
    arr
    数组中的最大元素数,这意味着它是程序耗尽空间之前结果中可能出现的最大位数

    请注意,代码仅在其数组声明中使用
    MAX
    。它没有任何地方使用
    MAX
    来确定它是否尝试从这些数组末尾以外的内存读取或写入。这是一件坏事™. 您的“Abort trap:6”错误几乎肯定会发生,因为试图计算3251!正是这样做的:使用了一个太大的索引
    arr
    fact

    要查看给定阶乘所需的位数,可以增加
    MAX
    (例如,增加到20000),并用类似以下内容替换
    main
    中现有的
    printf
    调用:

    printf("Factorial requires %d digits.\n", length + 1);
    
    请注意,我使用
    length+1
    ,因为
    length
    本身不是位数:而是
    fact
    中包含结果最高有效位的数组位置索引。如果我尝试计算3251!,则输出为:

    Factorial requires 10008 digits.
    
    这比您在
    fact
    中可用的数字多8位,默认
    MAX
    值为10000。一旦程序逻辑超出数组中分配的空间,其行为将未定义。您碰巧看到错误“Abort trap:6”

    有趣的是,这是我尝试计算3250时的输出

    Factorial requires 10005 digits.
    

    MAX
    设置为10000时,这仍然太多,程序无法可靠运行,因此您的程序成功计算3250!这一事实可能令人惊讶,但这就是未定义行为的本质:可能您的程序会产生正确的结果,可能会崩溃,可能会自我感知并启动其mis针对俄罗斯目标的siles()。这样编码不是一个好主意。如果您的程序需要比可用空间更多的空间来完成计算,它应该停止并显示适当的错误消息,而不是试图继续它正在执行的操作。

    正如Scott Hunter指出的,
    MAX
    事实中的最大元素数
    arr
    arrays,这意味着在程序空间耗尽之前,结果中可能出现的最大位数

    请注意,代码仅在其数组声明中使用
    MAX
    。它没有任何地方使用
    MAX
    来确定它是否尝试从这些数组末尾以外的内存读取或写入。这是一件坏事™. 您的“Abort trap:6”错误几乎肯定会发生,因为试图计算3251!正是这样做的:使用了一个太大的索引
    arr
    fact

    要查看给定阶乘所需的位数,可以增加
    MAX
    (例如,增加到20000),并用类似以下内容替换
    main
    中现有的
    printf
    调用:

    printf("Factorial requires %d digits.\n", length + 1);
    
    请注意,我使用
    length+1
    ,因为
    length
    本身不是位数:而是
    fact
    中包含结果最高有效位的数组位置索引。如果我尝试计算3251!,则输出为:

    Factorial requires 10008 digits.
    
    这比您在
    fact
    中可用的数字多8位,默认
    MAX
    值为10000。一旦程序逻辑超出数组中分配的空间,其行为将未定义。您碰巧看到错误“Abort trap:6”

    有趣的是,这是我尝试计算3250时的输出

    Factorial requires 10005 digits.
    

    MAX
    设置为10000时,这仍然太多,程序无法可靠运行,因此您的程序成功计算3250!这一事实可能令人惊讶,但这就是未定义行为的本质:可能您的程序会产生正确的结果,可能会崩溃,可能会自我感知并启动其mis针对俄罗斯目标的siles()。这样编码不是一个好主意。如果您的程序需要比可用空间更多的空间来完成计算,它应该停止并显示适当的错误消息,而不是试图继续它正在做的事情。

    回答得很好!谢谢。因此,现在我想知道哪一个是避免“中止陷阱”的“好实现”.在计算阶乘之前,我如何知道需要多少位数字?以避免处理一个会给我带来错误的数字…最简单的方法是