此代码为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

python - Python中的正相异求和-LMLPHP
这就是你需要实现的答案。例如,如果N为2,则公式为n < 1,这意味着n为0,r为2如果N是8,则n < 2.77,这意味着n是2,r是5。

07-27 20:06