先贴出我的正确代码:
```python
a=int(input())
for i in range(2,a):
b=[1]
sums=1
c=int(pow(i,0.5))+1
for j in range(2,c):
if i%j==0:
b.append(j)
b.append(int(i/j))
sums+=j+int(i/j)
if sums==i:
b.sort()
print(i,'its factors are ',end='')
for j in range (len(b)):
print(b[j],end=' ')
print()
```
这道题思路还是很简单的,但有一点很值得思考,每一个数的所有因子该怎么求出.
这里我们先明确一下:
```
因子1*因子2=该数
1*6=6```
显然1和该数本身肯定是它的两个因子,即该数的最大因子肯定是它本身。
1和6
但显然我本不可能从1开始测试到它本身,开销太大。
先说一下我再c++题解中看到方法,用2和它对应的因子来限制取值范围,即使2不是它的因数,该数的其它因数也不可能大于2对应的‘因子’,这样一来几乎就减少了一半的计算量
``2*3=6#3为截至数
``
然后说一下我的个人想法:
首先,因数是有对应性的,每一个因数都有自己的对应数,在求出其中一个的同时也等于求出的了它对应的哪一个,当我们从一开始求因数的时候,可以看作:
从1增大
对应从本身减小
那么理论上其实我们只要求得该数的二分之一次方处即可
`int(根号6)=2`
这里要注意循环语句
另外这里我没有考虑开根结果存在,如5,5,25中两个5重复的问题
读者可以自行添加
0.0分
5 人评分