【C++】B2079 求出 e 的值


在这里插入图片描述

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳]
本文专栏: C++

文章目录

  • 💯前言
  • 💯题目介绍
    • 输入格式
    • 输出格式
    • 输入输出样例
    • 说明/提示
  • 💯实现方法一:单层 `for` 循环计算
    • 代码实现
    • 运行逻辑解析
    • 优点
    • 不足
  • 💯实现方法二:双层 `for` 循环计算
    • 代码实现
    • 运行逻辑解析
    • 优点
    • 不足
  • 💯实现方法三:`while` 循环实现
    • 代码实现
    • 运行逻辑解析
    • 优点
    • 不足
  • 💯对比与总结
    • 效率对比
    • 适用场景
  • 💯优化与扩展
    • 提前终止优化
    • 现代化输出
    • 函数封装
  • 💯小结


在这里插入图片描述


💯前言

  • 在计算机科学和数学中,自然对数底数 e e e 是一个重要的数学常数,出现在许多算法和模型中。在本次分析中,我们将基于一个经典的编程题目,通过不同实现方法计算 e e e 的值,探讨各种实现的优劣,最终总结出最佳实践和相关优化方案。本文将从题目介绍开始,逐步讲解每种实现方式的特点及适用场景,同时延伸到更广泛的优化和扩展。
    C++ 参考手册
    在这里插入图片描述

💯题目介绍

B2079 求出 e 的值
在这里插入图片描述

题目描述:

利用公式
e = 1 + 1 1 ! + 1 2 ! + 1 3 ! + ⋯ + 1 n ! e = 1 + \frac{1}{1!} + \frac{1}{2!} + \frac{1}{3!} + \cdots + \frac{1}{n!} e=1+1!1+2!1+3!1++n!1
求自然对数底数 e e e 的值,要求保留小数点后10位。

输入格式

输入只有一行,该行包含一个整数 n n n,表示计算 e e e 时累加到 1 / n ! 1/n! 1/n!

输出格式

输出只有一行,该行包含计算出来的 e e e 的值,要求打印小数点后 10 位。

输入输出样例

  • 输入 #1:
    10
    
  • 输出 #1:
    2.7182818011
    

说明/提示

  • 输入范围为 2 ≤ n ≤ 15 2 \leq n \leq 15 2n15
  • 本题的阶乘增长较快,但计算范围内( n ≤ 15 n \leq 15 n15),可以通过合理的数据类型避免溢出。

💯实现方法一:单层 for 循环计算

这是初学者常用的一种实现方法,逻辑清晰且代码简洁,能够直接累积计算每一项的值。以下为代码及详细分析:

代码实现

#include <iostream>
#include <cstdio>
using namespace std;int main() {int n = 0;cin >> n;             // 输入阶数 ndouble e = 1;         // 初始化 e 的值为公式第一项 1long long m = 1;      // 阶乘初始化为 1,使用 long long 避免溢出for (int i = 1; i <= n; i++) {  // 从第 1 项开始累加m *= i;         // 累乘计算阶乘 i!e += 1.0 / m;   // 累加当前项 1/i! 到 e}printf("%.10lf", e);  // 保留 10 位小数输出结果return 0;
}

在这里插入图片描述

运行逻辑解析

  1. 变量初始化:

    • n 表示输入的阶数。
    • e 存储计算结果,初始值为 1(对应公式中的第 0 项)。
    • m 用于存储阶乘,初始值为 1。
  2. 循环计算:

    • 从 1 开始,逐步累乘得到当前的阶乘值 i ! i! i!
    • 累加每一项的倒数值 1 i ! \frac{1}{i!} i!1 e e e
  3. 输出结果:

    • 使用 printf 格式化输出,保留小数点后 10 位。

优点

  • 效率高:每次计算利用上一次的结果,无需重复计算阶乘。
  • 实现简单:逻辑直观,代码量少。
  • 时间复杂度: O ( n ) O(n) O(n)

不足

  • 逻辑固定,适用于计算所有项都必须累加的场景。

💯实现方法二:双层 for 循环计算

这是一种更贴近数学公式的实现方法,通过嵌套循环完成阶乘计算和累加。代码如下:

代码实现

#include <iostream>
#include <cstdio>
using namespace std;int main() {int n = 0;cin >> n;             // 输入阶数 ndouble e = 1;         // 初始化 e 的值为公式第一项 1for (int i = 1; i <= n; i++) {  // 外层循环控制累加项数long long m = 1;            // 初始化当前项阶乘为 1for (int j = 1; j <= i; j++) {  // 内层循环计算阶乘 i!m *= j;}e += 1.0 / m;               // 累加当前项到 e}printf("%.10lf", e);  // 保留 10 位小数输出结果return 0;
}

在这里插入图片描述

运行逻辑解析

  1. 外层循环:

    • 控制当前计算项的序号,从 1 到 n n n
  2. 内层循环:

    • 逐步累乘,计算当前项的阶乘 i ! i! i!
  3. 累加计算:

    • 将当前项 1 i ! \frac{1}{i!} i!1 累加到 e e e 中。

优点

  • 逻辑清晰:每一层循环分别处理阶乘和累加。
  • 贴近数学公式:非常直观地将公式分解为两部分。

不足

  • 效率低:阶乘值每次都需要重新计算,存在大量重复计算。
  • 时间复杂度: O ( n 2 ) O(n^2) O(n2)

💯实现方法三:while 循环实现

这是老师给出的实现方式,使用 while 循环控制计算过程,进一步简化了逻辑,同时保留高效性。

代码实现

#include <iostream>
#include <cstdio>
using namespace std;int main() {int n = 0;cin >> n;             // 输入阶数 nint i = 1;            // 循环计数器,初始为 1double e = 1;         // 初始化 e = 1long long fac = 1;    // 阶乘初始化为 1while (i <= n) {      // 循环从 1 到 nfac *= i;         // 更新阶乘值e += 1.0 / fac;   // 累加当前项i++;              // 计数器自增}printf("%.10lf\n", e);  // 输出结果return 0;
}

在这里插入图片描述

运行逻辑解析

  1. 变量初始化:

    • 循环计数变量 i 初始为 1,用于控制循环。
    • 阶乘值 fac 初始为 1,用于累乘计算。
    • 累加结果 e 初始为 1。
  2. while 循环:

    • i ≤ n i \leq n in 时,计算当前项的阶乘,并累加其倒数到 e e e
  3. 输出结果:

    • 使用 printf 输出结果,保留小数点后 10 位。

优点

  • 逻辑清晰:将循环控制变量与计算逻辑分离,代码条理性更强。
  • 高效:与单层 for 循环一样,每次计算直接更新阶乘值,避免重复计算。
  • 灵活性:while 循环适合条件控制较多的场景,易于扩展。

不足

  • for 循环相比,稍显冗长。

💯对比与总结

效率对比

实现方式时间复杂度重复计算灵活性
单层 for 循环 O ( n ) O(n) O(n)中等
双层 for 循环 O ( n 2 ) O(n^2) O(n2)中等
while 循环实现 O ( n ) O(n) O(n)

适用场景

  1. 单层 for 循环:适合简单、固定范围的计算。
  2. 双层 for 循环:更适合教学场景,便于逐步拆解公式。
  3. while 循环:适合条件较复杂的计算,尤其是需要提前终止的场景。

💯优化与扩展

提前终止优化

对于较大的 n n n,后续项对 e e e 的贡献极小,可以通过设置阈值提前终止循环:

while (i <= n) {fac *= i;double term = 1.0 / fac;if (term < 1e-12) break;  // 如果当前项小于阈值,提前退出e += term;i++;
}

现代化输出

使用 C++ 的 coutsetprecision 输出结果:

#include <iostream>
#include <iomanip>
using namespace std;int main() {int n;cin >> n;double e = 1;long long fac = 1;for (int i = 1; i <= n; i++) {fac *= i;e += 1.0 / fac;}cout << fixed << setprecision(10) << e << endl;return 0;
}

在这里插入图片描述

函数封装

将阶乘计算或 e e e 的累加封装为函数,方便复用:

double calculateE(int n) {double e = 1;long long fac = 1;for (int i = 1; i <= n; i++) {fac *= i;e += 1.0 / fac;}return e;
}

💯小结

本文通过一个经典的编程题目,探讨了 e e e 的计算方法及其优化。无论是单层 for 循环、双层循环,还是 while 循环,各有其适用场景和优劣。根据实际需求选择合适的方法,同时可通过提前终止、现代化输出、函数封装等方式进一步优化。希望本文能为读者带来关于算法实现与优化的启发!


在这里插入图片描述


在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/891156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计

SMEC88ST SDK卡发包下载 目前市场上很多嵌入式产品方案都是可以破解复制的&#xff0c;主要是因为方案主芯片不具备防破解的功能&#xff0c;这就导致开发者投入大量精力、财力开发的新产品一上市就被别人复制&#xff0c;到市场上的只能以价格竞争&#xff0c;最后工厂复制的产…

精准识别花生豆:基于EfficientNetB0的深度学习检测与分类项目

精准检测花生豆&#xff1a;基于EfficientNet的深度学习分类项目 在现代农业生产中&#xff0c;作物的质量检测和分类是确保产品质量的重要环节。针对花生豆的检测与分类需求&#xff0c;我们开发了一套基于深度学习的解决方案&#xff0c;利用EfficientNetB0模型实现高效、准…

MarkItDown的使用(将Word、Excel、PDF等转换为Markdown格式)

MarkItDown的使用&#xff08;将Word、Excel、PDF等转换为Markdown格式&#xff09; 本文目录&#xff1a; 零、时光宝盒&#x1f33b; 一、简介 二、安装 三、使用方法 3.1、使用命令行形式 3.2、用 Python 调用 四、总结 五、参考资料 零、时光宝盒&#x1f33b; &a…

Qanything 2.0源码解析系列6 PDF解析逻辑

Qanything 2.0源码解析系列6: PDF解析逻辑 type: Post status: Published date: 2024/12/04 summary: 深入剖析Qanything是如何拆解PDF的,核心是pdf转markdown category: 技术分享 原文:www.feifeixu.top 😀 前言: 在前面的文章中探究了图片是怎么进行解析的,这篇文章对…

【Agent】Chatbot、Copilot与Agent如何帮助我们的提升效率?

人工智能&#xff08;AI&#xff09;技术的迅猛发展正在深刻改变我们的生活和工作方式。你是否曾想过&#xff0c;未来的工作场景会是什么样子&#xff1f;AI的崛起不仅仅是科技的进步&#xff0c;更是我们生活方式的革命。今天&#xff0c;我们将深入探讨三种主要的AI能力&…

如何使用python读写游戏内存以及使用特征码匹配基址

一.读写内存所需的基本参数 接下来我将使用GTA5游戏举例 1.通过进程名称获取进程pid from psutil import process_iterdef get_process_id_by_name(process_name):for process in process_iter(["pid", "name"]):if process.info["name"] pr…

简述css中z-index的作用?如何用定位使用?

z-index是一个css属性&#xff0c;用于控制元素的堆叠顺序&#xff0c; 如何使用定位用index 1、position&#xff1a;relative&#xff1b; z-index&#xff1b; 相对于自己来定位的&#xff0c;可以根据top&#xff0c;bottom&#xff0c;right&#xff0c;left&#xff…

CCNP_SEC_ASA 第六天作业

实验需求&#xff1a; 为保障内部用户能够访问Internet&#xff0c;请把10.1.1.0/24网络动态转换到外部地址池202.100.1.100-202.100.1.200&#xff0c;如果地址池耗尽后&#xff0c;PAT到Outside接口 提示&#xff1a;需要看到如下输出信息 Inside#telnet 202.100.1.1 Trying …

计算机网络 (13)信道复用技术

前言 计算机网络中的信道复用技术是一种提高网络资源利用率的关键技术。它允许在一条物理信道上同时传输多个用户的信号&#xff0c;从而提高了信道的传输效率和带宽利用率。 一、信道复用技术的定义 信道复用&#xff08;Multiplexing&#xff09;就是在一条传输媒体上同时传输…

敏捷开发Scrum的深入理解和实践

敏捷开发&#xff0c;特别是Scrum方法&#xff0c;已经逐渐成为软件开发领域的主流方法。Scrum不仅适用于软件开发&#xff0c;还适用于其他需要快速响应变化和灵活交付的领域。本文将深入探讨Scrum的核心概念、流程、优势、挑战及其在实践中的应用。 一、Scrum的核心概念 Scru…

计算机视觉目标检测-2

文章目录 摘要abstract1.Fast R-CNN1.1 RoI pooling1.2 End-to -End model1.3 多任务损失-Multi-task loss1.4 R-CNN、SPPNet、Fast R-CNN效果比对 2.Faster R-CNN2.1 RPN原理2.2 效果对比2.3 Faster R-CNN总结 3.总结4.参考文献 摘要 本周学习了Fast R-CNN和Faster R-CNN算法…

JavaScript网页设计案例:动态交互式任务列表

在现代网页开发中&#xff0c;JavaScript被广泛应用于实现动态交互效果。看完这一篇你就可以设计一个动态任务列表&#xff0c;全面展示HTML、CSS和JavaScript在前端开发中的实际应用。通过本案例&#xff0c;你将深入了解事件监听、DOM操作以及用户交互设计的实现过程。 案例需…

【MySQL】索引 面试题

文章目录 适合创建索引的情况创建索引的注意事项MySQL中不适合创建索引的情况索引失效的常见情况 索引定义与作用 索引是帮助MySQL高效获取数据的有序数据结构&#xff0c;通过维护特定查找算法的数据结构&#xff08;如B树&#xff09;&#xff0c;以某种方式引用数据&#xf…

使用Excel制作通达信自定义“序列数据“

序列数据的视频教程演示 Excel制作通达信自定义序列数据 1.序列数据的制作方法&#xff1a;删掉没有用的数据&#xff08;行与列&#xff09;和股代码格式处理&#xff0c;是和外部数据的制作方法是相同&#xff0c;自己上面看历史博文。只需要判断一下&#xff0c;股代码跟随的…

【ELK】ES单节点升级为集群模式--太细了!

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言准备工作1. 查看现状【单节点】2. 原节点改集群模式3. 改es配置文件&#xff0c;增加集群相关配置项4. *改docker映射的端口* 启动新节点5. docker-compose起一…

关于区块链的安全和隐私

背景 区块链技术在近年来发展迅速&#xff0c;被认为是安全计算的突破&#xff0c;但其安全和隐私问题在不同应用中的部署仍处于争论焦点。 目的 对区块链的安全和隐私进行全面综述&#xff0c;帮助读者深入了解区块链的相关概念、属性、技术和系统。 结构 首先介绍区块链…

webauthn介绍及应用

1、webauthn介绍 官网&#xff1a;https://webauthn.io/ 1.1、什么是webauthn&#xff1f; webauthn即Web Authentication&#xff0c;是一个符合W3C标准的Web认证规范。它通过公私钥加密技术&#xff0c;实现无密码认证&#xff0c;用户仅需通过pin码、指纹、面部识别、usb …

ElasticSearch如何做性能优化?

大家好&#xff0c;我是锋哥。今天分享关于【ElasticSearch如何做性能优化?】面试题。希望对大家有帮助&#xff1b; ElasticSearch如何做性能优化? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Elasticsearch 是一个开源的分布式搜索引擎&#xff0c;广泛用于…

瑞芯微全新芯片平台RK3506优势详解,高集成低功耗,为工业而生 触觉智能测评

RK3506是瑞芯微Rockchip在2024年第四季度全新推出的Arm嵌入式芯片平台&#xff0c;三核Cortex-A7单核Cortex-M0多核异构设计&#xff0c;CPU频率达1.5Ghz, M0 MCU为200Mhz。 而RK3506芯片平台下的工业级芯片型号RK3506J&#xff0c;具备-40-85℃的工业宽温性能、发热量小&#…

Docker 安装全攻略:从入门到上手

Docker 安装全攻略&#xff1a;从入门到上手 在当今的软件开发与部署领域&#xff0c;Docker 已经成为了一项不可或缺的关键技术。它能够将应用程序及其依赖项打包成轻量级、可移植的容器&#xff0c;极大地简化了开发、测试和部署的流程。本文将详细讲解在不同操作系统下 Doc…