同志们好!
挖掘机技术哪家强?
当然是洒家强!
广告结束
今天给大家带来的题目是:C++ 2033:阶乘之和
目录:
1.题目到底是啥?
2.史上最详细题解!
3.代码举例!
题目到底是啥?
不告诉你
那是不可能的
2033:【例4.19】阶乘之和
【题目描述】
输入nn,计算S=1!+2!+3!+…+n!S=1!+2!+3!+…+n!的末6位(不含前导0)。n≤10^6, n!表示前n个正整数之积。
【输入】
输入n。
【输出】
如题述,之和。
【输入样例】
10
【输出样例】
37913
【提示】
【数据范围】
对于所有数据,1≤n≤999999。
题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=2033
史上最详细题解!
这道题难度:AAA
为啥这道题难?
因为这道题有两大难点:
1.溢出 2.超时
你可能会说:这有啥难的?前面的2026不是一样的吗?
但是:
【数据范围】
对于所有数据,1≤n≤999999。
再看看2026:
【数据范围】
对于所有数据:1≤n≤10。
懂了吗?
所以解决第一个问题有两种方法:
1.把int换成long long
2.每一步都取后6位(%1000000)
但是取那种方法呢?
答:两种都用呗!
第一个解决了,那么第二个呢?
其实,最经典算阶乘和的方法是:
for(int i=1; i<=n; i++)
{
tmp=1;
for(int j=1; j<=i; j++)
tmp*=j;
s+=tmp;
}
但是,突然想到:这会超时!
如果最大数据1000000,那么要计算:500000500000次,不超时才怪呢!
啊!
如果计算1!+2!+3!那么会怎么算呢?
1!=1;
2!=1*2
3!=1*2*3;
那么:1!+2!+3!=1+1*2+1*2*3
只要每次tmp*=i,s+=tmp,不就行了?
对喽!
算阶乘和的第二种方法:
for(int i=1; i<=n; i++)
{
tmp*=i;
s+=tmp;
}
所以代码是:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
long n,s=0,m=1;
cin>>n;
for(int i=1; i<=n; i++)
{
m*=i;
m=m%1000000;
s+=m;
s=s%1000000;
}
cout<<s;
return 0;
}
代码举例!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
long n,s=0,m=1;
cin>>n;
for(int i=1; i<=n; i++)
{
m*=i;
m=m%1000000;
s+=m;
s=s%1000000;
}
cout<<s;
return 0;
}