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
的情况下,我们可以找到 n
当 sum
达到 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 = 2
,x = 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()))
然后必须打印总和和最后加的数以及加的数
我目前被卡住了,我设法让总和部分工作。最后添加的数字输出打印 "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
的情况下,我们可以找到 n
当 sum
达到 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 = 2
,x = 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()))