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变量表示不考虑进位的值