数的阶乘,到13!整型变量就会溢出。而要算到1000!,甚至到10000!就要用字符串的来模拟乘法运算。
下面是代码:
#include <stdio.h>
#include <string.h>
int main()
{
int n, i, j, end;
int a[100000] = {0};
while(scanf("%d", &n) != EOF)
{
memset(a, 0, sizeof(a));
end = 0;
a[0] = 1;
for(i = 1; i <= n; i++)
{
//模拟乘法运算,每一位都乘以i
for(j = 0; j <= end; j++)
{
a[j] = a[j] * i;
}
//进位
for(j = 0; j <= end; j++)
{
if(a[j] > 10000 && j == end)
{
int c = a[j] / 10000 ;
a[j] = a[j] % 10000 ;
a[j+1] += c ;
end++ ;
}
else if(a[j] > 10000)
{
int c = a[j] / 10000 ;
a[j] = a[j] % 10000 ;
a[j+1] += c ;
}
}
}
printf("%d", a[end]);
for(i = end - 1; i >=0 ; i--)
{
printf("%04d",a[i]);
}
printf("\n");
}
return 0;
}
采用四位一存的方法,效率比一位一存的快。
下面是结果:
模拟的乘法运算:
比如 11 * 12
这是一位一存的,同理,四位一存就是大于100000就进位~~~
可以自行用笔演算一下,我可能讲的不是很清楚,请见谅!!~~