C++ 中的自恋数

2025年5月13日 | 阅读 4 分钟

在本文中,我们将讨论 C++ 中的自恋数 (Narcissistic Numbers)。在讨论 C++ 中的自恋数之前,我们必须了解其方法、示例、时间复杂度和空间复杂度。

什么是自恋数?

一个数如果等于其各位数字的位数次幂之和,则该数被称为阿姆斯特朗数 (Armstrong Number) 或自恋数 (Narcissistic Number)。由于一个三位数 n 有三个数字,每个数字 d 都被提升到三次方,然后将这些数字的总和与 n 进行比较。如果它们匹配,这个数就是自恋数。例如,1^3 + 5^3 + 3^3 = 153,这使得它成为一个自恋数。在 C++ 中,通过使用除法和取模运算提取每个数字,计算出每个数字的幂,然后将结果相加以确保它们与原始数字相同。这个属性对于特定的整数是独一无二的,并经常被用作编程和计算数学中学习条件语句、循环和数学运算的练习。

方法 1:使用 Pow 函数

该方法包括计算数字的位数,然后提取每个数字。通过将每个数字提升到总位数的幂次来确定其幂值,并应用 pow 函数。为了确定一个数是否是自恋数,计算这些幂次数字的总和,并将其与原始数字进行比较。

示例

让我们以一个例子来说明 C++ 中的自恋数

输出

 
Enter a number to check if it is a Narcissistic number: 153
153 is a Narcissistic number.   

说明

该程序确定某个数字是否与自恋数有关。程序定义了 countDigits 函数,它递归地计算输入整数的位数。利用这个位数,另一个名为“Narcissistic”的函数计算所有数字提升到总位数次幂后的总和。为了判断这个数是否是自恋数,然后将其与初始数字进行比较。当用户在主函数中输入一个数字时,计算机会将该数字传递给“Narcissistic”函数。如果函数返回 true,程序会指出该数字是自恋数,否则指出不是。该方法基于幂运算和模运算的使用。这个用户友好的应用程序可以动态处理任何用户提供的输入。它突出了重要的编程思想,包括条件、循环和递归。

复杂度分析

  • 时间复杂度:O(log n):因为迭代次数(每个数字处理一次)由输入数字的位数决定,所以时间复杂度是 O(log n)。
  • 辅助空间:O(1):因为无论输入数字的大小如何,只使用恒定量的额外空间,所以辅助空间为 O(1)。

方法 2:使用字符串的简化方法

简化方法使用字符串作为输入,遍历字符串。程序计算每个字符(从字符派生出的数字)提升到字符串长度(表示数字位数)的幂。通过这样做,原始数字不需要任何数值运算。

示例

让我们再举一个例子来说明 C++ 中的自恋数

输出

 
Enter a number to check if it is a Narcissistic number: 154
No, the number is not Narcissistic.   

说明

这个 C++ 程序用于判断一个给定的数是否为自恋数。它定义了一个名为 checkNarcissistic 的函数,该函数接收一个包含数字的字符串输入,计算所有数字提升到数字位数次幂后的总和,并将其与初始值进行比较。如果总和等于原始值,该函数返回一条消息确认该数是自恋数。主函数要求用户输入一个数字,然后将其发送给 checkNarcissistic 进行处理。之后,显示结果。该程序通过字符串操作和数学运算(如类型转换和求幂)来处理数字。

复杂度分析

  • 时间复杂度:O(n log n):时间复杂度受字符串长度 (n) 和计算过程中将数字提升到某个幂次所需的对数运算 (log n) 的影响。
  • 辅助空间:O(1):空间复杂度是恒定的,因为无论输入大小如何,只使用了几个变量。