能被3或5整除的1000以内的数字和(等差数列求和方式)

首先想到的肯定是这样

sum = 0
for i in range(1,1000):
    if i % 3== 0 or i % 5 == 0:
        sum = sum + i
print(sum)

显然虽然这个方法代码简单,也很容易理解,但是运行的效率低。

所以再想想,在1-1000中,3的倍数最小的是3,最大的是999。5的倍数最小的是5,最大的是995。3和5的倍数其中肯定有交集,而他们肯定是15的倍数,那么,15的倍数最小的是15,最大的是990。

所以,我们要的答案应该是:3的倍数和+5的倍数和-15的倍数的和(交集)。

这个结论可以扩展到跟大的范围

def sum_mod(minNumber,maxNumber):
    return (maxNumber/minNumber)*(minNumber+maxNumber)/2  #等差数列求和公式

这个minNumber肯定就是3或5这个最小公因数,那么maxNumber却不好确定,比如我们在计算是使用的是 sum_mod(3,999)+sum_mod(5,995)-sum_mod(15,990) 这个maxNumber要我们指定,这样是不好的,很多代码规范里面都提到了魔鬼数字,尽量不要直接用数字。

我们希望给一个范围和最小公因数就给出这个能被最小公因数整除的的数字之和。修改一下定义的函数。把minNumber和maxNumber当成范围的上下界,加一个参数commonDivisor代表最小公因数。

def sum_mod(minNumber,maxNumber,commonDivisor):    
    minScope = minNumber - (minNumber % commonDivisor) + commonDivisor #给定范围中最小能被 commonDivisor 整除的数
    maxScope = maxNumber - (maxNumber % commonDivisor)   #给定范围中最大能被 commonDivisor 整除的数
    n= maxScope/commonDivisor - minScope/commonDivisor + 1 #项数
    return  n* (minScope+maxScope)/2  #等差数列求和公式

这样一来,我们的输入参数就全是题目给定的值,更具有泛化性,在确定下界时为什么这么做的原因是 范围并不一定是从0开始的 ,比如求[52,141]之间能被5整除的数之和。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

中南自动化学院至渝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值