C语言 计算阶乘防止溢出方法
注:
对于 int 型, 13! 会溢出
对于 long long 型,21!会溢出
思路:
1.用数组存储每一位
2.将每一位都与1-n中的每一个数相乘
3.计算进位和本位数
4.处理最后的进位情况
#include<stdio.h>
#define MAX 10000
int main()
{
int n;
while (scanf("%d",&n) != EOF)
{
int a[MAX];
a[1] = 1; //从a[1]开始
int p = 1; //p 表示位数,刚开始只有一位a[1] 且 a[1] = 1,不能为0,0乘任何数为0
int one = 0; //one 表示进位数,刚开始进位为0
int i,j;
//溢出情况
int s = 1;
for (i=2;i<=n;i++)
s *= i;
printf("%d\n",s); //输出溢出的算法,方便对比
for (i=2;i<=n;i++) //n 的阶乘
{
for (j=1;j<=p;j++) //循环a[],让每一位都与i乘
{
int temp = a[j] * i + one; //temp变量表示不考虑进位的值
one = temp / 10; //计算进位大小
a[j] = temp % 10; //计算本位值
}
/*处理最后一位的进位情况*/
//由于计算数组的最后一位也得考虑进位情况,所以用循环讨论
//因为可能最后一位可以进多位;比如 12 * 本位数8,可以进两位
while(one) //当进位数存在时,循环————这个循环的作用就是将一个数分割,分割的每一位放入数组中
{
a[j] = one % 10;
one = one / 10;
j++; //表示下一位
}
p = j - 1; //由于上面while中循环有j++,所以位会多出一位,这里减去
}
for (i=p;i>=1;i--) //逆序输出
printf("%d",a[i]);
}
}