C 当输入为10且阶乘值仅返回33个数字时,程序失败

C 当输入为10且阶乘值仅返回33个数字时,程序失败,c,factorial,C,Factorial,当输入10作为输入时,程序(用于计算阶乘)失败,而对于所有其他输入(在系统限制内),程序工作正常,除非输入任何字符,否则程序进入无限循环,输出为“阶乘1是1” 如果我输入34或任何大于34的数字,那么我得到的输出是“输入数字的阶乘为0”。对于大于33的数字,为什么阶乘值为0 节目如下: #include <stdio.h> #include <stdlib.h> int display(); void fact_fun(int num_fact); int

当输入10作为输入时,程序(用于计算阶乘)失败,而对于所有其他输入(在系统限制内),程序工作正常,除非输入任何字符,否则程序进入无限循环,输出为“阶乘1是1”

如果我输入34或任何大于34的数字,那么我得到的输出是“输入数字的阶乘为0”。对于大于33的数字,为什么阶乘值为0

节目如下:

 #include <stdio.h>
    #include <stdlib.h>

int display();
void fact_fun(int num_fact);

int main()
{
    int num = 0;
    char next;

    next=display();

    while( next != '\n')
    {
        num = next;
        fact_fun(num);
        next=display();
    }

    return 0;
}

int display()
{
    int input;
    printf("\nEnter number to find factorial or press ENTER to exit :");
    scanf("%d",&input);

    return input;
}

void fact_fun(int num_fact)
{
    int fact=1;
    if((num_fact>='a' && num_fact<='z') || (num_fact>='A' && num_fact<='Z'))
    {
        printf("Alphabet is not allowed");
    }
    else if(num_fact < 0)
    {
        printf("Negative number is not allowed");
    }
    else if(num_fact == 0)
    {
        printf("Factorial of %d is 1",num_fact);
    }
    else
    {
        for(int i = 1; i<= num_fact; i++)
        {
            fact = fact*i;
        }
        printf("Factorial of %d is %d",num_fact,fact);
    }
}
#包括
#包括
int display();
无效事实(整数事实);
int main()
{
int num=0;
下一步;
下一步=显示();
而(下一步!='\n')
{
num=下一个;
事实乐趣(num);
下一步=显示();
}
返回0;
}
int显示()
{
int输入;
printf(“\n输入数字以查找阶乘,或按ENTER键以退出:”;
scanf(“%d”,输入(&I));
返回输入;
}
无效事实乐趣(整数事实)
{
int-fact=1;

如果((num_-fact>='a'&&num_-fact='a'&&num_-fact在
显示
函数中使用
char
而不是
int
scanf
中使用
%d
格式说明符,请将其更改为
int
。您在编译时一定看到了警告:

warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘char *’
除此之外,当输入的数字为10时,您的程序无法交付,要解决此问题:

 while(next>=0) //WHEN NEGATIVE NUMBER IS ENTERED IT WILL END THE LOOP
 {
    num = next;
    fact_fun(num);
    next=display();
 }
简化事实\u乐趣:

void fact_fun(int num_fact)
{
    int fact =1;
    if(num_fact == 0)
    {
        printf("Factorial of %d is 1",num_fact);
        return;
    }
    else
    {
        for(int i = 1; i<= num_fact; i++)
        {
            fact = fact*i;
        }
        printf("Factorial of %d is %d",num_fact,fact);
    }
}

34!
295232799039660414084761618609643520000000
。在您的机器上,
int
可以存储的最大值是多少?它是小于还是大于
29523279903966041408476186964352000000
?@MarkDickinson我的系统是64位的,因此它可以保存至少0到18446744073范围内的整数值,709,551,615@user3121023那么,如果在一个变量中接受整数和字符,该怎么办?@vasudhadix,64位系统只允许这么多的存储空间。但是
Int32
保持32位。尝试查看
long
@Kari:
long
也只能保证表示+/-(2**31-1)(无论
Int32
是什么,它都不是标准类型)。这不取决于平台,而是取决于实现。谢谢。现在程序在输入10时没有失败。但我不明白为什么它在(下一步!='\n')
?@vasudhadix更新我的答案时不使用
。因为输入存储在一个变量中(它是int类型)如果我输入字符,那么它将进入无限循环,那么可以做些什么来解决它?@VasudhaDixit updated但当输入字母或符号字符时,程序将进入无限循环
int display()
{
    char inp[10]={0};
    int  input;
    int index=0;
    printf("Enter number to find factorial or press ENTER to exit : ");

    while(((input=getchar())!=EOF)&(index<10))
    {
        if((input>='0')&&(input<='9'))
        {
            inp[index++]=input;
        }
        else if(input=='\n')
            break;
        else
            return -1;
    }
    input=atoi(inp);

    return input;
}