题目
完全数(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不发生因子关系。所以我们可以将序列范围缩小一半。