阶乘之和(C语言)
输入n,计算S=1!+2!+3!+4!..+n!的末尾六位(不含前导0),n<10^6。
第一种直观的想法:
#include<stdio.h>
#include<math.h>
int main()
{
int n;
int i, j;
int sum = 0, f = 1;
scanf_s("%d", &n);
for (i = 1; i <= n; i++)
{
f = 1;
for ( j = 1; j <= i; j++)
{
f = f * j;
}
sum += f;
}
printf("%d", sum%1000000);
return 0;
}
这种想法忽视了int型变量的最大范围,造成溢出。
利用每步取模,把数保持在一个相对较小的范围内,这样做也不会影响最后的结果。
#include<stdio.h>
#include<math.h>
#define MOD 1000000
int main()
{
int n;
int i, j;
int sum = 0, f = 1;
scanf_s("%d", &n);
for (i = 1; i <= n; i++)
{
f = 1;
for ( j = 1; j <= i; j++)
{
f = f * j % MOD;
}
sum = (sum + f) % MOD;
}
printf("%d", sum);
return 0;
}