输入 n ,计算 S = 1!+ 2!+ 3!+ ... +n!的末6位 (不含前导 0 )。n <= 1e6, n!表示前 n 个正整数之积。
样例输入:
10
样例输出:
37913
代码如下
#include<iostream>
using namespace std;
int main()
{
int num; //存放数据
int n; //要输入的数
while(cin>>n)
{
int s = 0;
for (int i = 1; i <= n; i++) //小于 n 的整数
{
num = 1;
for (int j = 1; j <= i; j++) //计算阶乘
num *= j;
s += num; //求和
}
// cout<<s<<endl;
cout<<(s % 1000000 )<<endl; // 取余
}
return 0;
}
但是当我们输入的 n = 100 时,输出结果为-961703。直接告诉我们,乘法溢出了。
**注:要计算只包含加法、减法和乘法的整数表达式除以正整数 n 的余数,可以在每步计算之后对 n 取余,结果不变。一个数对另一个数反复取余结果不变,即 a % b == a % b % b % b
代码如下
#include<iostream>
using namespace std;
int main()
{
int num;
int n;
while(cin>>n)
{
int s = 0;
for (int i = 1; i <= n; i++)
{
num = 1;
for (int j = 1; j <= i; j++)
num = num % 1000000 * j;
s = (s + num) % 1000000;
}
cout<<s<<endl;
}
return 0;
}
**注:当 n 从40开始,答案始终不变。因为 25!末尾有 6 个 0 ,所以后面的所有相都不会影响和的末位 6 位数————只需要在程序前面加一条语句 " if (n > 25) n = 25; ",就可提高效率