【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,一经查实,立即删除!

相关文章

RabbitMQ基础篇之Java客户端 Work Queues

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

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 | 文档 添加数据 数据为中国旅客数据 转置表字段 列数据转行数据

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;希望能够帮助…

机器学习笔记——正则化

大家好&#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. 然后双击进行…

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

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

matlab读取二进制文件,要指定保存的数据类型

1、 a [1,2;3,4]; fileID fopen(hao.bin, wb); % 以二进制写入模式打开文件 fwrite(fileID, a, uint16); % 假设a中的数据可以表示为无符号32位整数 fclose(fileID); fileID fopen(hao.bin, rb); % 以二进制读取模式打开文件k fread(fileID)&#xff1b; 自动识别16位还…

【Java 数据结构】移除链表元素

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 1. 题目 2. 解析 3. 代码实现 4. 小结 题目出处&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 1. 题目 给你一个链表的头节点 …

CannotRetrieveUpdates alert in disconnected OCP 4 cluster解决

环境&#xff1a; Red Hat OpenShift Container Platform (RHOCP) 4 问题&#xff1a; Cluster Version Operator 不断发送警报&#xff0c;表示在受限网络/断开连接的 OCP 4 集群中无法接收更新。 在隔离的 OpenShift 4 集群中看到 CannotRetrieveUpdates 警报&#xff1a; …

jvm排查问题-实践追踪问题 与思路--堆内堆外内存泄漏排查方针

概述 排查问题的一般思路是:现象 ——> 直接原因 ——>根本原因。 从问题现象出发,可以分为 应用逻辑问题、资源使用问题、虚拟机异常: 应用逻辑可能导致报错增加、死锁、程序退出等;资源问题主要集中在CPU上升和内存上升(OOM Kill);虚拟机问题通常包括GC问题、进…

uniapp:微信小程序文本长按无法出现复制菜单

一、问题描述 在集成腾讯TUI后&#xff0c;为了能让聊天文本可以复制&#xff0c;对消息组件的样式进行修改&#xff0c;主要是移除下面的user-select属性限制&#xff1a; user-select: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms…

深入浅出:从入门到精通大模型Prompt、SFT、RAG、Infer、Deploy、Agent

阅读原文 渐入佳境 我们都知道&#xff0c;通过编写一个提示词&#xff08;prompt&#xff09;&#xff0c;我们可以引导大模型生成回答&#xff0c;从而开启愉快的人工智能对话&#xff0c;比如让模型介绍一下卡皮巴拉。上边简图描述了这个过程&#xff0c;我们拆成两部分 pr…