此代码为n=2
提供了错误的输出,并且速度非常慢。
我怎样才能使这段代码更有效地查找尽可能多的正的、不同的和呢?
任务-将给定的正整数n
表示为多对的和
尽可能清楚的正整数。
输出:第一行包含一个整数k
。第二行包含k
个正的、不同的正和,其总和为n
。Sample Input:
8
Output:
3
1 2 5
n=int(input())
p=[]
i=1
while(i<=n):
if (n-i) not in p:
p.append(i)
n-=i
i+=1
print(len(p))
print(*p)
最佳答案
你可以用分析的方法解决这个问题。如果你要联系的号码是N
,那么答案总是
1+2+3+ ... +n + r = N
其中
n
是最大的可能数,因此n < r
。例如,取N=8
,并考虑n
的可能值n sum(1..n) r
0 0 8
1 1 7
2 1+2=3 5
3 1+2+3=6 2 // too high, n is not less than r
因此,当
N
为8时,n
为2,r
为5,给出1+2+5的答案。所以问题变成了,给定
N
的值,我们如何计算n
第一步是注意到1到n
的和由方程给出1+2+3+ ... +n = n(n+1)/2
把它代入第一个方程
n(n+1)/2 + r = N
利用
n < r
这一事实,我们可以将其重写为n(n+1)/2 + n < N
这就是你需要实现的答案。例如,如果
N
为2,则公式为n < 1
,这意味着n
为0,r
为2如果N
是8,则n < 2.77
,这意味着n
是2,r
是5。