「模拟赛20190329」作业 泰勒展开

题目描述

小W的数学老师总是喜欢布置计算题作为业,小W却只对证明题感兴趣。
这一次,小W的数学老师布置了一道计算题:
已知递推公式
fn=1nfn1(n>0)
f0=1e
对于老师给定的n,小W需要计算fn。小W认为这个作业非常简单而且无聊,所以他找到了你,希望你能帮助他完成这道作业题。

输入

第一行一个整数n,表示给定的n

输出

一行一个浮点数表示答案,保留4位小数。

样例

样例输入

#样例1
0
#样例2
2

样例输出

#样例1
0.6321
#样例2
0.2642

数据范围

对于10%的数据n<=10
对于100%的数据满足n<=10000

题解

真·数学题。

解法1
10个暴算,1150二分答案用fn1=1fnn验证。更大的算近似值fn1n+2

解法2
Orz,跪膜Freopen大爷。
1e泰勒展开变成(1)n1n!
fn变成非递推形式,这一步很好想:

fn=i=0n(1)nin!i!(1)nn!1e

1e带入进去,注意1e展开后是有无穷项的。

fn=i=0n(1)nin!i!i=0(1)n+in!i!

因为nin+i的奇偶性是相同的,我们可以前后抵消一大坨

fn=i=n+1(1)n+in!i!=i=1(1)in!(n+i)!

发现n!(n+i)!必定小于1,而且是在做除法,精度不会流失,那么我们就可以枚举i,直到某一项小于eps之后就停止,由于是以阶乘的速度减小,所以只需要枚举几项就可以了。

代码采取的是第二种方法。

Code:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define eps 1e-6
int n;
double ans, now;
int main()
{
	scanf("%d", &n);
	now = 1;
	for (int i = 1; now >= eps; i++)
	{
		now = now / (n + i);
		if (i & 1)
			ans += now;
		else
			ans -= now;
	}
	printf("%.4f\n", ans);
}
posted @   ModestStarlight  阅读(252)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示