为什么153的阶乘在下面的程序中失败了

Why the factorial of 153 has failed in following program

我创建了一个 myfun.h 头文件,里面有两个函数。阶乘函数和 amstrong 函数以及 myfun.c 文件 这里是myfun.h节目

void factorial(int n,int *fact)
{
    int i;
    *fact=1;
    for(i=1;i<=n;i++)
      *fact=*fact*i;
}
amstrong(int n)
{
    int sum=0,num,rem,cube;         
    num=n;
    while(num>0)
    { 
      rem=num%10;
      cube=rem*rem*rem;        
      num=num/10;
      sum=sum+cube;
    }
    if(sum==n)                         
      return(1);  
    else
      return(0);
 }

这是myfun.c程序

#include<stdio.h>
#include "myfun.h"
int main()
{
    int num,rev,f,code;
    printf("Enter number :");
    scanf("%d",&num);
    code=amstrong(num);
    if(code==1)
      printf("\nNumber is amstrong\n");  
    else
      printf("Number is not amstrong\n");
    factorial(num,&f);
    printf("Factorial of %d is %d ",num,f);
    getch();
}

其中 amstrong 函数正在运行 fine.But 阶乘函数给出输出 0。我没有在不删除指针变量的情况下尝试过。但是,如果我想 运行 它带有指针变量,那么我需要做哪些更改?

程序的输出是

Enter number: 153
Number is amstrong
Factorial of 153 is 0

发生这种情况是因为每种数据类型都可以容纳一定数量。你得到错误答案的原因是因为 153fact 会比 int 变量可以容纳的更大。它应该适用于较小的值。

编辑

要存储更大的数字,您可以使用 long long int 数据类型。

您可以使用的最小数据类型范围是:

short int and int: -32,767 to 32,767
unsigned short int and unsigned int: 0 to 65,535
long int: -2,147,483,647 to 2,147,483,647
unsigned long int: 0 to 4,294,967,295

int单独存储不了fact(153)给出的值。针对您的情况使用较小的值,否则更改类型:改用 long long int。

sizeof(long double) = 12 机器上的字节 运行 32 位 linux。可以使用 printf 中的 %LE 打印输出。输出将呈指数形式。

编辑

factorial(20) : 2432902008176640000 当使用 long long int 这是您可以使用 long long int 类型的变量获得的最大值。 对于更大的范围,请使用 long double.

153! = 2.01 E+269.

如果unsigned long long是64位,它可以容纳最大值2^64 = 18.45 E+19

您将需要使用某种形式的 "big int" library 来计算像这样的大数字。