每日刷题(三十二)
BASIC-30、阶乘计算
这个题目有点魔鬼,因为你要考虑你的数组到底设多大,你的数组能设多大。其次你得考虑数字存放的逻辑,分情况讨论,进位和未进位,同时需要设置两个变量,一个存放刚开始做乘法所产生的的进位,另一个存放前一个数乘法运算后产生的进位,每一轮循环要修改其值。
详细C代码如下:
#include<stdio.h>
//#include<string.h>
int main()
{
int a[90000] = {0};
// memset(a, 0, sizeof(a));
int n;
scanf("%d",&n);
int i;
a[0] = 1;
int j = 1;
int t = 0;
int m = 0;
int s = 0;
for(j = 1; j <= n; j++)
{
t = 0;
m = 0;
for(i = 0; i < 90000; i++)
{
m = a[i] * j / 10;
a[i] = a[i] * j % 10;
if(a[i] + t >= 10) //前一个数的进位
{
s = a[i] + t;
t = m + s / 10;
a[i] = s % 10;
}
else
{
a[i] += t;
t = m;
}
}
}
int k = 0;
for(i = 89999; i >= 0; i--)
{
if(a[i] != 0)
k = 1;
if(k)
printf("%d",a[i]);
}
printf("\n");
return 0;
}
这里列出一部分示例以及结果: