1+3+5...+n 的总和,直到总和超过 100

Sum of 1+3+5...+n until the sum exceeds 100

然后必须打印总和和最后加的数以及加的数

我目前被卡住了,我设法让总和部分工作。最后添加的数字输出打印 "23" 但应该是 "21"。最后,如何打印添加的数字数量?

输出目标:121, 21, 11

这是我的代码:

n = int()
sum = 0
k = 1
while sum <= 100:
  if k%2==1:
    sum = sum + k
  k = k + 2
print('Sum is:', sum)
print("last number:", k) 

编辑:感谢大家的帮助和解答!

您可以执行以下操作:

from itertools import count

total = 0
for i, num in enumerate(count(1, step=2)):
    total += num
    if total > 100:
        break

print('Sum is:', total)
print("last number:", 2*i + 1)

为了避免k的更新,您还可以使用下面的成语

while True:
    total += k  # do not shadow built-in sum
    if total > 100:
        break

或 Python >= 3.8:

while (total := total + k) <= 100:
    k += 2

注意,(你可以通过归纳证明

1 + 3 + 5 + ... + 2 * n - 1 == n**2
<-----    n items    ----->

到目前为止一切顺利,为了获得 n,您所要做的就是计算 平方根:

n = sqrt(sum) 

100 的情况下,我们可以找到 nsum 达到 100

n = sqrt(100) == 10

所以当 n == 10 然后 sum == 100,当 n = 11(最后一项是 2 * n - 1 == 2 * 11 - 1 == 21)时 sum 超过 100:它将是

n*n == 11 ** 2 == 121

一般情况下

n = floor(sqrt(sum)) + 1

代码:

def solve(s):
    n = round(s ** 0.5 - 0.5) + 1;
    
    print ('Number of numbers added: ', n);
    print ('Last number:             ', 2 * n - 1)
    print ('Sum of numbers:          ', n * n)
    
solve(100)

我们这里不需要循环,可以有 O(1) 时间和 space 复杂度的解决方案(请 fiddle

更多演示:

test : count : last : sum
-------------------------
  99 :    10 :   19 : 100
 100 :    11 :   21 : 121
 101 :    11 :   21 : 121  

而不是

k = k + 2

if (sum <= 100):
  k = k +2

...因为那毕竟是你要加2的情况。

为了也计算数字,有另一个计数器,也许 howManyNumbers,它从 0 开始,每次添加一个数字就加 1。

如果你有好奇心尝试一些部分和,你会立即认出完美平方数列。因此,有 11 项,最后一个数字是 21。

print(121, 21, 11)

更严重的是:

i, s= 1, 1
while s <= 100:
    i+= 2
    s+= i

print(s, i, (i + 1) // 2)

更改 while 循环,以便在顶部之前测试和 break

k=1
acc=0
while True:
  if acc+k>100:
    break
  else:
    acc+=k
    k+=2

>>> k
21
>>> acc 
100

如果你希望累加器是 121 只需在中断前添加 k:

k=1
acc=0
while True:
  if acc+k>100:
    acc+=k
    break
  else:
    acc+=k
    k+=2

根据您的代码,这将实现您的目标:

n = 0
summed = 0
k = 1

while summed <= 100:
   n += 1
   summed = summed + k
   if summed <= 100:
       k = k + 2

print(f"Sum is: {summed}")
print(f"Last number: {k}") 
print(f"Loop count: {n}")

这将解决您的问题,而无需过多更改您的代码:

n = int()
counter_sum = 0
counter = 0
k = 1
while counter_sum <= 100:  
  k+= 2
  counter_sum =counter_sum+ k
  counter+=1
print('Sum is:', counter_sum)
print("last number:", k) 
print("number of numbers added:", counter) 

只需将您的代码更改为,

n = int()
sum = 0
k = 1  
cnt = 0
while sum <= 100:
  if k%2==1:
    sum = sum + k
  k = k + 2
  cnt+=1
print('Sum is:', sum)
print("last number:", k-2)
print('Number of Numbers Added:', cnt) 

原因在这里, 计数器应该从 0 开始,最后打印的数字的答案应该是 k-2,因为当总和超过 100 时,它也会将 k 的值增加 2,之后循环将陷入 false 状态。

你不需要循环。 1...n 与步长 k 的总和由

给出
s = ((n - 1) / k + 1) * (n + 1) / k

您可以将其简化为标准二次方程

s = (n**2 - k * n + k - 1) / k**2

要找到 s >= x 的整数解,求解 s = x 并取结果的上限。将二次公式应用于

n**2 - k * n + k - 1 = k**2 * x

结果是

n = 0.5 * (k + sqrt(k**2 - 4 * (k - k**2 * x - 1)))

对于 k = 2x = 100 你得到:

>>> from math import ceil, sqrt
>>> k = 2
>>> x = 100
>>> n = 0.5 * (k + sqrt(k**2 - 4 * (k - k**2 * x - 1)))
>>> ceil(n)
21

唯一的麻烦是当您得到 n == ceil(n) 时,因为您实际上想要 s > x。在这种情况下,您可以测试:

c = ceil(n)
if n == c:
    c += 1

你甚至可以解决一般情况:

def sum_n(n, k=3, s =1):
    if s + k > n:
        print('Sum is', s + k)
        print('Last number', k)
        return
    sum_n(n, k + 2, s + k)
sum_n(int(input()))