C++ 恶数

2025年3月25日 | 阅读 4 分钟

如果一个整数的唯一质因数的数字之和等于它本身的数字之和,则称该整数为“欺骗数”(hoax number)。值得注意的是,在计算质因数数字之和时,我们不包括 1,因为 1 不是质数。当一个合数被同一个质因数多次整除时,请注意只计算该质因数一次。

此问题的主要目标是确定给定的正整数(大于 1)是否应被视为欺骗数。一旦确定一个数字满足所有条件,可以称之为欺骗数,我们就可以确认它确实属于这一类别。

输入包含数字 58,其质因数分解为 2*29。给定数字的数字总和为 5+8=13,其不同质因数的数字之和为 2+2+9=13。所提供的数字是欺骗数,因为数字之和相等,并且它满足一个数字成为欺骗数所需的所有要求。

数字 54 分解为质因数是 2*3*3*3。2 和 3 是唯一的质因数,它们的数字之和是 2+3=5。

给定数字的数字之和为 5 + 4 = 9。给定数字不是欺骗数,因为其数字之和不等于其不同质数数字之和。

算法

如果一个数字的数字总和等于其唯一质因数的数字总和,则该数字被认为是欺骗数。不同质因数数字之和可以通过简单地计算该数字的所有不同质因数来获得。

  • 我们将数字除以 2,直到它变为奇数,并将所有的 2 存储在另一个列表中。
  • 使用 for 循环,我们将从 i=3 迭代到 i<=sqrt(N),每次将 i 增加 2,因为此时 N 必须是奇数。
  • 如果 N 可以被 i 整除,则重复除以它并计算除以的次数。之后,将 i 的值保存在另一个列表中。
  • 每当 N 再次被同一个数字 (i) 整除时,继续更新 N 的值。
  • 由于如果 N 是大于 2 的质数,使用上述步骤 N 不可能变为 1,因此请使用 if 语句检查其值,如果大于 2 则将其存储到另一个列表中。

示例

让我们举一个例子来说明 C++ 中的欺骗数。

输出

Enter a number to check if it's a hoax number: 58
58 is a hoax number
Enter a number to check if it's a hoax number: 345
345 is not a hoax number