希望您能在这个问题上帮助我:
所以这个问题在Kattis中几乎是完美的
https://open.kattis.com/problems/almostperfect
这是我的密码。第一个测试通过,但第二个测试不通过,它会给我am消息(超过时间限制)
def isperfect(n):
l=0
for i in range(1,n):
if n%i==0:
l+=i
if l>n+2 :
print(f"{n} not perfect")
break
if(l==n):
print(f"{n} perfect")
elif abs((n-l))<=2:
print(f"{n} almost perfect")
else :
print(f"{n} not perfect")
while True:
try :
n = int(input())
isperfect(n)
except EOFError:
break;
错在哪里?或者我如何优化它? 先谢谢你
问题是代码太慢了。幸运的是,有一个简单的优化,可以节省你
注意,如果
d
是n
的除数,那么n / d
也是一个除数。此外,如果d
小于sqrt(n)
,则n / d
大于sqrt(n)
(反之亦然)这实际上意味着我们只需要检查到
sqrt(n)
的数字,而不是检查到n
的所有数字。对于我们找到的每一个除数d
,我们也确保将n / d
添加到除数和中,除非d
是1
或者正好是sqrt(n)
下面是代码中可能出现的情况:
另一个小错误是,当
l > n + 2
时,您将打印两次消息,这很容易通过删除break
之前的print
来解决这可能是另一个适用于python的解决方案,我认为我们需要注意
(i*i != num)
,这样我们就不会开始添加相同的数字。祝您今天过得愉快!!😊😊相关问题 更多 >
编程相关推荐