C++ 2033:阶乘之和(史上最详细题解)

同志们好!

挖掘机技术哪家强?

当然是洒家强!

广告结束


今天给大家带来的题目是: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;
}

最重要的来了!

本文作者正在冲10粉,喜欢就关注! 

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值