Python判断完全数并输出三角形数

题目

完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。它所有的真因子(即除了自身以外的约数)的和,恰好等于它本身。

性质1:所有的完全数都是三角形数。(一定数目的点或圆在等距离的排列下可以形成一个等边三角形,这样的数被称为三角形数。)

输入格式:

在一行中输入一个 正整数 N。

输出格式:

判断正整数 N 是否是完全数。如果是完全数则输出所有因子和的等式,例如6=1+2+3,并输出其由星号组成的三角形数,详见样例

输入样例1:

6

输出样例1:

6=1+2+3
*
**
***

输入样例2:

7

输出样例2:

7不是完全数

实现

分析

真因子->除了所求的数本身以外的约数。约数->能够跟所求数整除的[1,n)范围的数叫做约数。

思路

生成[1,n)的序列,并循环遍历序列,返回元素i,判断i与n的模是否为0。结果为0,我们认为这个数可以整除n,且这个数不等于n即这个数是n的因子。将这个数添加到因子列表中。随后根据因子位置/索引输出对应的星号。

问题

题目对于*号的输出规则,没有明确的定义,不是很严谨。以至于我刚开始看到6=1+2+3,第一反应就认为*号的个数与因子的值有关。

这里说明一下星号的输出规则:

星号按照因子的个数来输出(也可根据因子位置输出)。如某个数有x个因子,从第一行开始,输出1个星号。接着下一行继续输出,每一行*数量依次增加,直到输出第X行。(这里发现*数量跟行数有关,其实就是前面说的因子位置)

代码

n=int(input())
yz=[]
wq=1
if n>1:#1不是完全数    
    yz = [i for i in range(1,int(n/2)+1) if n%i==0]
    sumEquation=str(yz)[1:-1].replace(',','+').replace(' ','')#删除列表左右两边的[]以及列表中存在的空格,并把所有,号替换为+号。
#除了上面这种方法,还可以使用for拼接或字符串的join函数。如:sumEquation='+'.join(yz)
    if sum(yz)==n:
        print("{0}={1}".format(n,sumEquation))
        for s in range(1,len(yz)+1):
            print('*'*s)#复制s个

    else:
        wq=0
else:
    wq=0
if not wq:
    print("{0}不是完全数".format(n),end='')

上面代码做了一点优化。如找公因子的时候,我的序列范围是[1,n/2],因为我们知道2是除了1以外的最小的公因子,n/2之后的数字肯定与n不发生因子关系。所以我们可以将序列范围缩小一半。

 

给TA打赏
共{{data.count}}人
人已打赏
开发

C#反射创建实例和继承概念之面向对象编程详解02

2023-9-15 13:44:10

开发

C/C++数据结构-链表的测试题

2023-9-15 13:45:51

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索