为什么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
发生这种情况是因为每种数据类型都可以容纳一定数量。你得到错误答案的原因是因为 153
的 fact
会比 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 来计算像这样的大数字。
我创建了一个 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
发生这种情况是因为每种数据类型都可以容纳一定数量。你得到错误答案的原因是因为 153
的 fact
会比 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 来计算像这样的大数字。