有趣的python—求1000以内3和5的倍数之和

编者这里就利用python解决一些数学问题,解决方法不只一个,如果有想法的小伙伴欢迎评论,如果觉得不错,欢迎点赞,关注,收藏哦(^▽ ^)

一、问题描述

如果我们列出10以内所有3或5的倍数,我们将得到3、5、6和9,这些数的和是23。

求1000以内所有3或5的倍数的和。

二、问题解决

通过从0-999进行列举,判断每一个数是否能被3或5整除,如果可以,则相加。

程序如下,:

sum = 0
len = int(input('please int a num:'))
for i in range(len):
    if i % 3 == 0 or i % 5 == 0:
        print(i)
        sum += i       

print('sum:', sum)

我们先利用10以内的数进行验证,可以看到成功打印出了10以内所有3或5的倍数,并且得到了正确的和

please int a num:10
0
3
5
6
9
sum: 23

因此我们可以得出答案为:233168

三、更高效的解决方案

上述方法的确可以成功解决问题,但是,如果我们要求的数非常大,如 1 0 100 10^{100} ,这样,程序可能要列举一段时间才能得到结果。

以1000以内的数,我们观察其规律能够得出:

3的倍数之和:3+6+9+12+…+999=3*(1+2+3+4+…+333)
5的倍数之和:5+10+15+…+995=5*(1+2+…+199)

而等式右边我们可以利用求和公式求出结果
S n = 1 2 n ( a 1 + a n ) S_n = \frac{1}{2}n(a_1+a_n)

在本题目中, a 1 = 1 , a n = n a_1=1, a_n=n ,而 n n 等于1000整除3(5)。在python中整除可以用// 表示。

这里要注意的一点就是,15同时是3和5的倍数,因此,如果我们将3的倍数之和与5的倍数之和相加,实际上是将15的倍数之和加了2次(这里有点拗口,大家细细品味一下)。

最终,我们可以将程序变为这个样子:

len = int(input('please input a num:'))
def sum(multiples):
    n = (len-1) // multiples
    return multiples*(n*(n+1)) // 2

result = sum(3) + sum(5) - sum(15)
print(result)

我们同样能够的到相同的答案

please input a num:1000
233168
发布了33 篇原创文章 · 获赞 216 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/weixin_41045354/article/details/104495575