输入n,计算s=1!+2!+……+n!的末六位,n<=1e6,
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main() { ll n,m,a,b,c; m=1;a=0; scanf("%lld",&n); for (int j=1;j<=n;j++) { for (int i=1;i<=j;i++) { m*=i; } a+=m;m=1; } b=a%1000000; printf("%lld",b); }
上面的代码存在效率问题,下面的代码可以显示程序所需的时间,从而观察到时间变化:
#include<stdio.h> #include<time.h> int main() { const int mod=1000000; int n,s=0; scanf("%d",&n); if(n>25)n=25; for (int i=1;i<=n;i++) { int factorial=1; for (int j=1;j<=i;j++) factorial=(factorial*j%mod); s=(s+factorial)%mod; } printf("%d\n",s); printf("Time used =%.2f\n",(double)clock()/CLOCKS_PER_SEC); return 0;}
输入数据过大时,所耗时间越多,因此可以仔细观察当n大于25时,结果都是940313,因此做出修改。