Python中的完美数字程序:如何检查一个数字是否完美?

已发表: 2021-01-29

介绍

如果一个数的真除数(不包括该数本身)之和等于该数,则称该数为完美数。

为了更好地理解,让我们考虑一个例子,6 的正确除数是 1、2、3。现在这些除数之和等于 6(1+2+3=6),所以 6 被称为完美数. 而如果我们考虑另一个像 12 这样的数字,12 的正确除数是 1、2、3、4、6。现在这些除数的总和不等于 12,所以 12 不是一个完美的数字。

与其他语言相比,Python 编程相对更简单、更有趣,因为它的语法更简单,可读性好。 现在我们已经清楚了完美数的概念,让我们编写一个 python 程序来检查一个数字是否是一个完美数。 让我们构建一个 python 代码来检查给定的用户输入是否是一个完美的数字,并探索使用 python 编码的乐趣。 如果您有兴趣获得专业知识,请查看我们的数据科学计划。

阅读: Python 模式程序

目录

Python程序

找到完美数的基本解决方案是将 2 循环到 number-1,保持其适当除数的总和,并检查总和是否等于该数字。

n=int(input(“输入数字”))
总和=1
对于范围内的 i (2,n):
如果(n%i==0):
总和=总和+我
如果(总和==n):
print(n,"是一个完美数")
别的:
print(n,"不是一个完美的数字")

让我们看一下代码。

我们首先使用用户输入初始化 n 并将其类型转换为整数,因为默认情况下,用户输入在 python 中被读取为字符串。 我们需要检查 n 是否为完美数。 请注意,我们用 1 初始化和,因为 1 是所有整数(不包括零)的适当除数,因此我们可以排除循环中的迭代并直接从 2 开始。

我们将 2 循环到 number-1 并将整数添加到 sum 如果它是一个适当的除数。 最后,当我们退出循环时,我们正在检查获得的总和是否等于数字。 小菜一碟吧?

小优化版

在对上面的程序进行了试运行之后,我们可能会有一个问题,我们可以优化它吗? 好吧,但是我们可以在不改变算法的情况下将迭代次数减少到 number/2。 因为我们知道一个数不能有一个大于 number/2 的除数。

n=int(input(“输入数字”))
总和=1
对于范围内的 i (2,n//2+1):
如果(n%i==0):
总和=总和+我
如果(总和==n):
print(n,"是一个完美数")
别的:
print(n, “不是一个完美的数字”)

上面的代码片段几乎与前面的代码片段相似,唯一的区别是循环到 number/2。 请注意,我们正在执行整数除法以避免将其转换为浮点类型,并且我们正在循环直到 n//2+1,因为在 python 循环中不考虑范围中的最后一个整数。

限制

当我们被要求找到给定范围内的完美数字时,我们的解决方案将消耗与 number^2 成正比的时间,即 O(n²) 时间复杂度。 因为我们需要遍历给定范围内的每个数字,然后检查每个数字的正确除数。 并且很少有数字满足完美数字条件。 例如,0 到 1000 范围内的完美数只有 3(6、28、496)。

有一个优化的解决方案,我们不需要遍历所有元素来找到适当的除数,欧几里得公式指出 2 n -1(2 n - 1) 是一个偶数完美数,其中 n,(2 n - 1) 都是质数。 例如,6 满足上述方程,其中 n 为 2,并且 2, 2 2 - 1 (2 2 - 1 = 3) 都是素数。 但是如果我们被要求找出是否有任何奇完美数,我们无法回答。

此外,我们知道每种语言对其可以存储的整数范围都有限制。 有了这个限制,我们可能无法找到最大的完美数。

如果我们的输入数量很大,所有这些限制都会面临,但如果我们的输入数量很小,那么我们的初始解决方案将在更短的时间内起作用。

另请阅读:用于 Web 开发的 Python 框架

结论

我们已经知道了定义并理解了完美数字背后的概念。 演练了查找数字的基本解决方案是否是完美数字。 在观看了最初的解决方案之后,我们通过减少迭代次数对其进行了一些优化。 我们已经克服了我们算法的局限性,并讨论了欧几里得寻找偶数完美数的公式。

现在您已经了解了用于检查数字是否为完美数字的 python 程序。 尝试自己编写代码,如果发现任何重叠的迭代,请尝试对其进行优化。 此外,尝试构建代码以在给定的数字范围内查找完美数字。

如果您想了解 Python、数据科学,请查看 IIIT-B 和 upGrad 的数据科学执行 PG 计划,该计划是为在职专业人士创建的,并提供 10 多个案例研究和项目、实用的实践研讨会、与行业专家的指导,与行业导师一对一,400 多个小时的学习和顶级公司的工作协助。

解释 Python 中完美数字程序的复杂性。

如果一个数等于其除数之和,则称该数为完美数。 要检查一个数字是否完美,我们有两种方法。 第一种方法是一种简单的方法,其时间复杂度为 O(n2),因为我们为每个“i”迭代“j”次并检查其除数。
第二种方法是时间复杂度为 O(√n) 的优化解决方案。 在这里,我们不需要遍历每个数字。 我们可以使用欧几里得公式直接得出结论:
2n−1(2n − 1),其中 n 和 2n 是素数。
然而,这个公式不适用于奇完美数,因此,我们必须为它们找到另一种方法。

完美数字计划方法的局限性是什么?

这两种方法都很好,但只是在一定程度上。 由于某些技术性,它们都不能被认为是完美的方法。 这些方法的局限性如下:

1. 第一种也是朴素的方法更糟糕,因为它消耗大量的时间和内存,并且时间复杂度为 O(n2)。 这是因为我们使用了一个嵌套循环,并为外循环的每个元素迭代内循环 n 次。 这种方法是幼稚的,并且会为较大的 n 值提供 TLE,因此不推荐。
2. 然后我们有一个优化的方法来解决 O(√n) 中的问题。 这是一个很好的方法,除非奇完美数发挥作用。 我们不能用这种方法检查奇完美数,因为它基于“欧几里得偶完美数公式”,它只适用于偶完美数。

Python 适合竞技编程吗?

Python 从 C/C++ 甚至 Java 演变而来,被认为是最适合研究和开发目的的语言。 但是当谈到竞争性编程时,大多数编程社区都避免使用 Python。 原因在于 Python 是这三种语言中最慢的。