C++ 中的自数2025年5月22日 | 阅读 10 分钟 什么是自数?自数在数学中是一种特殊的数字。它不能通过将一个数字与其数字之和相加来生成。换句话说,当您应用一个称为“生成器函数”的特定函数时,没有其他数字会产生它。 什么是生成器函数?生成器 函数 的工作方式如下:
例如
因此,24 不是自数,因为 21 生成了它。 识别自数如果不存在数字 n 使得生成器函数等于该数字,则该数字是自数。 例如
方法 1:简单方法示例输出 Self Numbers from 1 to 100 are: 1 3 5 7 9 20 31 42 53 64 75 86 97 说明步骤 1:理解目的 代码的目的是在 1 到 100 的范围内查找自数。自数是不能通过将另一个数字与其数字之和相加而创建的数字。例如,21 不是自数,因为它可以由 15 生成(15 + 1 + 5 = 21)。另一方面,1、3 和 5 是自数,因为没有其他数字可以生成它们。 步骤 2:生成器函数 生成器函数是一个简单的数学函数。它接受一个数字 n,将 n 加到其数字之和,并返回结果。 例如
此生成器函数有助于我们确定哪些数字不是自数,因为通过生成器函数创建的任何数字都不能是自数。 步骤 3:标记非自数 要查找自数,代码
这是使用一个称为 isSelfNumber 的数组(或列表)完成的。此数组跟踪一个数字是否为自数。
步骤 4:循环遍历数字 程序从 1 循环到 100。对于每个数字
此标记可确保所有可以生成的数字都被识别为非自数。 步骤 5:查找自数 在标记完所有非自数之后,程序再次遍历 isSelfNumber 数组。任何仍标记为 true 的数字都将作为自数打印出来,因为没有其他数字生成它们。 示例演练让我们通过一个例子来看看逻辑是如何工作的
步骤 6:输出结果 最后,程序打印 isSelfNumber 数组中所有仍标记为 true 的数字。这些数字是范围内的自数。 时间复杂度外循环
生成器函数
总时间复杂度
空间复杂度用于跟踪的数组
其他变量
总空间复杂度
方法 2:使用数学排除法与其显式计算每个数字的生成器函数,不如通过迭代范围并标记生成的数字来直接识别非自数。这避免了对布尔数组的需求,并减少了冗余计算。 程序输出 Self Numbers from 1 to 100 are: 1 3 5 7 9 20 31 42 53 64 75 86 97 说明步骤 1:代码目的 代码用于在范围内(在此情况下为 1 到 100)识别自数。自数是任何数字都无法通过其本身与其数字之和相加而生成的数字。例如
步骤 2:生成器函数 生成器函数计算一个数字的“生成器”值。 对于给定的数字 n,它将 n 加到其数字之和。 例如
此函数帮助我们识别哪些数字被生成,哪些没有。 步骤 3:存储生成的数字 代码使用集合(unordered_set)来代替使用大型数组来跟踪生成的数字。
例如
步骤 4:识别自数 将所有生成的数字存储在集合中后 程序遍历范围内的所有数字(1 到 100)。 对于每个数字
例如
步骤 5:输出 程序打印范围中所有不在集合中的数字。这些是自数。 对于 1 到 100 的范围,输出为
此方法的优点高效的内存使用
更快的查找
清晰的逻辑
复杂度分析时间复杂度 生成器函数
检查自数
总时间复杂度: O(LIMIT⋅log(LIMIT)) 空间复杂度 生成的数字存储
临时变量
总空间复杂度: O(LIMIT) 方法 3:使用反向映射此方法通过直接反转生成数字的过程来工作。与其计算哪些数字被生成,不如尝试“反转”范围内每个数字的生成器函数。它消除了使用集合或 数组 来跟踪生成的数字的需要,从而提高了内存效率。 程序输出 Self Numbers from 1 to 100 are: 1 3 5 7 9 20 31 42 53 64 75 86 97 说明步骤 1:代码目的 目标是识别自数,即不能通过将一个数字与其数字之和相加而生成的数字。例如
步骤 2:数字之和函数 代码的第一部分是一个辅助函数,用于计算数字的数字之和。例如
步骤 3:检查一个数字是否为自数 为了确定数字 n 是否为自数
例如 对于 n=21
对于 n=3
步骤 4:循环遍历范围 程序会遍历指定范围内的所有数字(在此情况下为 1 到 100)。
例如
步骤 5:输出
优点C++ 中的自数具有以下几个优点 无额外内存
直接的逻辑
易于理解
复杂度分析时间复杂度
空间复杂度
性质C++ 中的自数具有以下几个特性 唯一性
范围独立性
自数的增长
无限计数
|
避免整数溢出和下溢对于确保 C++ 程序的正确性和安全性至关重要。当算术运算的结果超出数据类型的可表示范围时,就会发生整数溢出,从而导致意外行为。1. 理解整数溢出和下溢溢出:当...
阅读 4 分钟
C++20 简介,标准库在并发和并行编程以及 std::execution 命名空间的支持方面取得了显著进展。此命名空间提供的最重要功能之一是 std::execution::read_env,这是一种访问...的方法。
阅读 6 分钟
在 C++ 中,IQR 代表四分位距,是一个统计度量,它关注数据集中间部分的评分。它可以代数地表示为两个变量的减法:IQR = Q3−Q1,其中 IQR 是...
5 分钟阅读
C++ 中的 Std::is_base_of<Base,Derived>::value C++ 允许在编译时设置某些功能,而 std::is_base_of::value 是其功能之一,它允许检查类“Base”是否是“Derived”类的基类。此方法在 Base 不属于……时返回 true。
阅读 4 分钟
在软件开发和竞争性编程面试中,使用抽象数据结构来模拟现实世界事件的问题非常受到重视。这类问题实际上会测试对数据结构、图甚至算法等基本概念的了解。这是一个特殊的情况,它……
阅读 13 分钟
在本文中,您将通过几个示例了解如何使用 C++ 中的 DSU 检测图中的循环。图:图是由节点(顶点)和连接节点对的边组成的集合。图可以是定向的或非定向的,并且可以分配权重……
阅读20分钟
然而,在竞争性编程和算法设计的领域中,油漆围栏算法成为一个有趣且可行的难题。具体问题可以定义为计算用固定数量的柱子粉刷围栏的方法的数量...。
阅读 10 分钟
返回一个表示 n 支队伍最终比赛的字符串。队伍从 1 到 n 排名,排名 1 是最好的队伍,排名 n 是最差的队伍。标签对应于队伍的初始排名。匹配过程代表队伍...
阅读 4 分钟
引言图是计算机科学和数学中使用的基本元素,它们表示由节点连接的网络。在图论中,图进一步细分为连通性较低和连通性较高的图,以帮助确定要使用的正确算法和数据结构。这...
阅读20分钟
Recamán 序列是一个具有递归定义的数学级数,它呈现出有趣的模式和计算挑战。每个项 j 通过从 j 中减去 n 来计算,如果结果为正且尚未在级数中,则以 a0 = 0 开始。如果不是,则...
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India