【C++】2029:【例4.15】水仙花数


在这里插入图片描述

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

文章目录

  • 💯前言
  • 💯题目描述
  • 💯我的做法
    • 思路分析
    • 优势
    • 不足之处
  • 💯老师的做法
    • 思路分析
    • 优势
    • 不足
  • 💯对比和优化
    • 实现方式对比
    • 优化思路和操作
      • 1. 直接分解数字的各位
      • 2. 展开至任意位数水仙花数
  • 💯小结


在这里插入图片描述


💯前言

  • 在程序设计中,“水仙花数”是一个带有数学特色的热点题目。这个题目最核心的思路在于如何分解三位数,并检查它是否满足水仙花数的定义。通过进一步分析、优化,我们不仅能学习到原理,还可以探索于实现与效率之间的平衡点。本文将从题目解读、我的实现、老师做法、思路对比与优化,以及指向临水仙花数更学机。
    C++ 参考手册
    在这里插入图片描述

💯题目描述

2029:【例4.15】水仙花数
在这里插入图片描述

题目要求如下:

  • 计算 100 到 999 中的水仙花数
    如果三位数 ( ABC ) 满足以下条件:
    A B C = A 3 + B 3 + C 3 ABC = A^3 + B^3 + C^3 ABC=A3+B3+C3
    则称 ( ABC ) 为水仙花数。

例如:三位数 153 ,其三位系数分别是:
1 3 + 5 3 + 3 3 = 1 + 125 + 27 = 153 1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153 13+53+33=1+125+27=153
则 153 是水仙花数。

输入:

  • 无需输入

输出:

  • 由小到大输出满足条件的数,每个数单独一行。

示例输出:

153
370
371
407

💯我的做法

我的做法如下:

#include <iostream>
using namespace std;int main()
{for (int i = 100; i <= 999; i++) // 遍历所有三位数{int m = i; // 存储当前数字int count = 0; // 积累各位系数的立方和while (m){int j = m % 10; // 取位:下一个位系数count += j * j * j; // 计算立方并积累m /= 10; // 清除最低位}if (count == i) // 检查积累立方和是否等于原数字cout << i << endl; // 输出}return 0;
}

在这里插入图片描述

思路分析

  1. 通过 for 循环遍历 [100, 999] 范围内的所有数字,以判断每个数字是否是水仙花数。
  2. 通过循环中的初始化:
    • 用临时变量 m 存储当前数字,无需直接操作原数。
    • 定义 count 用于积累各位系数立方和。
  3. 通过内部 while 循环:
    • 取位系数:通过 m % 10 获得最低位;
    • 计算立方值并积累:通过 j * j * j 直接计算立方值;
    • 清除最低位:通过 m /= 10,将数字左移一位;循环至数字为 0 为止。
  4. 检查立方积累和是否等于原数,如等,则输出。

优势

  • 简洁直观: 计算每个位系数立方直接通过三次乘法完成,避免使用更复杂的函数。
  • 处理简单: 通过循环直接完成数字分解、积累立方和,无需额外函数调用,更实用。

不足之处

  • 总处理时间复杂度为 ( O(n \times d) ),对于三位数,( d ) 是 3,因此复杂度为实际上是存在优化空间的,如果可直接计算各位,则可省去一些循环操作。
  • 输出格式比较基本,如需更好看的输出,可选择增加分隔符。

💯老师的做法

老师的代码如下:

#include <iostream>
#include <cmath> // 引入函数 powusing namespace std;int main()
{for (int i = 100; i <= 999; i++) // 遍历所有三位数{int tmp = i; // 临时处理数字int ret = 0; // 积累各位系数立方和while (tmp){ret += pow(tmp % 10, 3); // 取位和立方,使用pow函数tmp /= 10; // 清除最低位}if (ret == i) // 检查积累立方和是否等于原数cout << i << endl; // 输出}return 0;
}

在这里插入图片描述

思路分析

  1. 核心比较:使用 pow 函数计算立方:
    老师的做法并没有用直接乘法计算立方,而是使用了标准库中的 pow 函数。这样做的好处是:在基础程序教学中,比较直观,学生能学习标准函数的应用;同时使用 pow 计算任意次方,优质显而易见。

  2. 居有化简:进一步生成临时变量,直接取位计算,治理系统优化:
    基于基础计算源,老师用 tmp 分解,保留原数,从维护和计算的规范性方面,有较高的规范性和应用性。

优势

  • 可读性更好: 使用 pow 函数,明确表达了“次方”的概念,更便于基础教学和理解。
  • 通用性更强: 如需更改次方,可直接修改为 pow(tmp % 10, n) ,适配与任意次方计算,更具通用性。

不足

  • 性能突出较少: 使用 pow 函数导致调用源库,效率上不如直接乘法。在计算量不大时,注意不显著;但如若展开到更大的数据量,远不如乘法计算的效率高。

💯对比和优化

实现方式对比

方式核心思想优势不足
我的做法通过三次乘法直接计算立方性能高,逻辑简洁,极对化相对基础学生,学习成本较高
老师做法使用 pow 函数计算立方可读性好,通用性强性能不如直接乘法,有调用源库的增加费用

优化思路和操作

在经典做法上,如下作举可能更加高效和实用:

1. 直接分解数字的各位

使用数学运算分解数字的各位,无需循环:

#include <iostream>
using namespace std;int main()
{for (int i = 100; i <= 999; i++){int a = i / 100;       // 百位int b = (i / 10) % 10; // 十位int c = i % 10;        // 个位if (i == a * a * a + b * b * b + c * c * c)cout << i << endl;}return 0;
}

在这里插入图片描述

在这里插入图片描述

这种做法可以直接获取各位,避免伴随调用和循环,效率更高。

2. 展开至任意位数水仙花数

通过使用函数展开计算任意位数的水仙花数:

#include <iostream>
#include <cmath>
using namespace std;// 检查水仙花数
bool isArmstrong(int n)
{int sum = 0, tmp = n;int digits = log10(n) + 1; // 位数while (tmp){sum += pow(tmp % 10, digits); // 次方积累tmp /= 10;}return sum == n;
}int main()
{for (int i = 100; i <= 999; i++){if (isArmstrong(i))cout << i << endl;}return 0;
}

在这里插入图片描述

在这里插入图片描述


💯小结

通过对我和老师做法的分析,我们能看到:

  1. 核心思想相同: 我和老师都是通过数字分解和立方积累,实现水仙花数的检查。
  2. 实现途径带有小差异: 我的做法更重视性能,老师做法更重视可读性。
  3. 优化思考: 通过直接分解数字和展开至任意位数,可以更加高效和通用。

在实际经验中,可根据场景和需求选择最适合的方案,例如教学中选择通过性更强的方案,而在效率优先的场景下,可选择性能更高的直接乘法。求真时,始终是计算积累的深层探索!


在这里插入图片描述


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

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

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

相关文章

形象地理解UE4中的数据结构 TLinkedListBase

大家都熟知链表&#xff0c;但不一定能快速看懂UE4中的数据结构。 TLinkedListBase表示“链接”中的一个结点&#xff0c;有三个成员&#xff1a; 一、ElementType Element; 表示具体的业务&#xff0c;例如int链条中的一个整数。 二、NextLink 表示 “下一个Node”&#…

RabbitMQ基础篇之Java客户端 Work Queues

文章目录 模型概述需求实现步骤创建队列定义消费者定义消息发送测试执行观察结论多消费者的作用性能差异生产环境中的应用 处理速度差异的情况 优化示例总结 模型概述 Work Queues 模型也称为任务模型&#xff0c;多个消费者绑定到同一个队列&#xff0c;共同消费队列中的消息…

CP AUTOSAR标准之FlexRayDriver(AUTOSAR_SWS_FlexRayDriver)(更新中……)

1 简介和功能概述 FlexRay驱动程序(Fr)抽象了特定FlexRay通信控制器(CC)的硬件相关实现细节。本规范主要依赖于符合FlexRay规范[13]的FlexRay CC。此外,本规范还支持符合FlexRay规范[14]的旧版FlexRay控制器。本SWS中因支持的FlexRay规范不同而导致的不同行为在适用的情况下以…

vscode代码AI插件Continue 安装与使用

“Continue” 是一款强大的插件&#xff0c;它主要用于在开发过程中提供智能的代码延续功能。例如&#xff0c;当你在编写代码并且需要进行下一步操作或者完成一个代码块时&#xff0c;它能够根据代码的上下文、语法规则以及相关的库和框架知识&#xff0c;为你提供可能的代码续…

ubuntu 如何使用vrf

在Ubuntu或其他Linux系统中&#xff0c;您使用ip命令和sysctl命令配置的网络和内核参数通常是临时的&#xff0c;这意味着在系统重启后这些配置会丢失。为了将这些配置持久化&#xff0c;您需要采取一些额外的步骤。 对于ip命令配置的网络接口和路由&#xff0c;您可以将这些配…

二、SQL语言,《数据库系统概念》,原书第7版

文章目录 一、概览SQL语言1.1 SQL 语言概述1.1.1 SQL语言的提出和发展1.1.2 SQL 语言的功能概述 1.2 利用SQL语言建立数据库1.2.1 示例1.2.2 SQL-DDL1.2.2.1 CREATE DATABASE1.2.2.2 CREATE TABLE 1.2.3 SQL-DML1.2.3.1 INSERT INTO 1.3 用SQL 语言进行简单查询1.3.1 单表查询 …

【ArcGIS Pro/GeoScene Pro】可视化时态数据

可视化过去二十年新西兰国际旅游业的发展变化 工程数据下载 ArcGIS Pro 快速入门指南—ArcGIS Pro | 文档 添加数据 数据为中国旅客数据 转置表字段 列数据转行数据

WebRTC :原理、协议和应用场景

WebRTC&#xff08;Web Real-Time Communication&#xff09;是一种用于在Web浏览器和移动应用程序之间进行实时通信的开放标准。它通过将音频、视频和数据传输集成到Web浏览器中&#xff0c;使得实时通信变得简单且无需任何插件或第三方软件。 一、WebRTC 的原理 WebRTC的实…

git在idea中操作频繁出现让输入token或用户密码,可以使用凭证助手(使用git命令时输入的用户密码即可) use credential helper

1、打开 idea 设置&#xff0c;找到 git 路径 File | Settings | Version Control | Git 2、勾选 Use credential helper 即可

CPT203 Software Engineering 软件工程 Pt.5 软件测试(中英双语)

文章目录 8. 软件测试8.1 Testing&#xff08;测试&#xff09;8.1.1 A note of testing under the V & A framework8.1.2 The Basics8.1.3 The Goals8.1.4 The Stages 8.2 Developing testing&#xff08;开发测试&#xff09;8.2.1 Unit testing&#xff08;单元测试&…

Docker基础知识 Docker命令、镜像、容器、数据卷、自定义镜像、使用Docker部署Java应用、部署前端代码、DockerCompose一键部署

目录 1.Docker 2.镜像和容器 2.1 定义 2.2 开机自动启动容器 3.docker命令 3.1 docker run 参数说明 3.2 常见命令 3.3 命令演示 3.4 命令别名 4.Docker命令详解 5.数据卷 5.1 定义 5.2 数据卷的相关命令 5.3 数据卷命令 5.4 挂载本地目录或文件 5.4.1 定义 5.4.2 mysql容器目录…

探索CSDN博客数据:使用Python爬虫技术

探索CSDN博客数据&#xff1a;使用Python爬虫技术 在数字化的浪潮中&#xff0c;数据的获取与分析变得日益关键。CSDN作为中国领先的IT社区和服务平台&#xff0c;汇聚了海量的技术博客与文章&#xff0c;成为一座蕴藏丰富的数据宝库。本文将引领您穿梭于Python的requests和py…

Python 自动化 打开网站 填表登陆 例子

图样 简价&#xff1a; 简要说明这个程序的功能&#xff1a; 1. **基本功能**&#xff1a; - 自动打开网站 - 自动填写登录信息&#xff08;号、公司名称、密码&#xff09; - 显示半透明状态窗口实时提示操作进度 2. **操作流程**&#xff1a; - 打开网站后自动…

2025常见的软件测试面试题

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 “ 今天我给大家介绍一些python自动化测试中常见的面试题&#xff0c;涵盖了Python基础、测试框架、测试工具、测试方法等方面的内容&#xff0c;希望能够帮助…

Markdown如何添加任务列表-复选框的添加

Markdown如何添加任务列表-复选框的添加 前言语法讲解使用场景及应用实例代码整和渲染结果小结其他文章快来试试吧☺️ Markdown如何添加任务列表-复选框的添加&#x1f448;点击这里也可查看 前言 To-do任务列表是一种很常见的时间管理工具&#xff0c;它适用于工作计划&…

机器学习笔记——正则化

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本笔记介绍机器学习中常见的正则化方法。 文章目录 正则化L1 正则化&#xff08;Lasso&#xff09;原理使用场景优缺点 L2 正则化&#xff08;Ridge&#xff09;原理…

详解MySQL在Windows上的安装

目录 查看电脑上是否安装了MySQL 下载安装MySQL 打开MySQL官网&#xff0c;找到DOWNLOADS 然后往下翻&#xff0c;找到MySQL Community(GPL) Downloads>> 然后找到MySQL Community Server 然后下载&#xff0c;选择No thanks,just start my download. 然后双击进行…

Ubuntu 网络图标直接没了

如果您的Ubuntu系统中有线网络图标消失了&#xff0c;可以按照以下步骤进行排查和修复&#xff1a; 1.重启NetworkManager服务 首先&#xff0c;尝试重启NetworkManager服务&#xff0c;这通常可以解决临时问题&#xff1a; bash sudo systemctl restart NetworkManager 2.检…

流架构的读书笔记(2)

流架构的读书笔记&#xff08;2&#xff09; 一、建模工具之一沃德利地图 推测技术的发展,交流和辩论思想的最有力的方法是沃德利地图 沃德利地图的制作步骤 1确定范围和用户需求 2确定满足用户需求所需的组件 3在一条范围从全新到被人们接受的演进轴上评估这些组成 部分的演…

电脑缺失libcurl.dll怎么解决?详解电脑libcurl.dll文件丢失问题

一、libcurl.dll文件丢失的原因 libcurl.dll是一个用于处理URL传输的库文件&#xff0c;广泛应用于各种基于网络的应用程序。当这个文件丢失时&#xff0c;可能会导致相关应用程序无法正常运行。以下是libcurl.dll文件丢失的一些常见原因&#xff1a; 软件安装或卸载不完整&a…