此代码为n=2
提供了错误的输出,而且速度很慢。
如何使这段代码能够更有效地找到更多正面不同的数字呢?
TASK - 将给定的正整数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)
答案 0 :(得分:4)
您可以通过分析解决问题。如果您尝试访问的号码为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。
答案 1 :(得分:0)
我不确定你的代码是否有其他缺陷,但我可以看到有类似于n = 2的测试用例会导致失败(例如,我相信n = 9)。试试if ((n-i) not in p and n-i != i)
。你失败n = 2,因为它看到i = 1不在p中,但你就是要把它放进去。
答案 2 :(得分:0)
找到序列的一种方法是有两个起点:N和m,其中N是我们试图达到的数字,m从1开始。
接下来,我们将m增加1,将其加到序列中并减少N.通过将N减少m并在N <= m * 2时停止来达到解。
例如,如果我们想要达到的数字是3
N = 3
然后,
s={} # array to store pairwise distinct positive integers
k = 3 # k = N at the beginning
m = 1 # always starts at 1
m*2 = 2
自
k is not <= m*2
我们将 m 添加到数组中,从 k 中减去 m ,将 1 添加到 m 并再次重复相同的过程。
s = {1}
k = k - m = 3 - 1 = 2
m = 1 + m = 1 + 1 = 2
现在,
m*2 = 4
自
k <= m*2
我们将 k 添加到我们的数组中,我们完成了。
s = {1, 2}
这是python中执行相同操作的代码。
def optimal_summands(n):
summands = [] # array to store pairwise distinct positive integers
k = n # marked the upper part
m = 1 # marked the lower part
if n == 2 or n == 1:
summands.append(n)
else:
for i in range(1,k):
if k <= 2*m:
summands.append(k)
break
else:
summands.append(m)
k = k - m
m = m + 1
return summands