📅  最后修改于: 2023-12-03 14:59:05.269000             🧑  作者: Mango
在计算机编程中,常常需要对一些数字进行筛选,比如只加3或5的倍数,求它们的和。这个问题看似简单,但是涉及到很多编程基础知识和算法。
暴力枚举是一种最基本的算法,就是把所有可能的情况都枚举一遍,然后找出符合条件的解。对于这个问题,我们可以使用for循环枚举1到n,判断每个数是否是3或5的倍数,如果是,就把它加起来。
def sum_of_multiples(n):
"""
暴力枚举,时间复杂度O(n),空间复杂度O(1)
"""
sum = 0
for i in range(1, n+1):
if i % 3 == 0 or i % 5 == 0:
sum += i
return sum
这个算法的时间复杂度是O(n),其中n是待处理的数字,空间复杂度是O(1),因为只存储一个和。
在数学中,有一个十分有用的公式叫做等差数列求和公式,它可以快速计算出一段连续的整数的和。如果我们将问题转化为3的倍数的和与5的倍数的和,那么我们只需要先分别计算出3的倍数和5的倍数的和,然后再减去3和5的最小公倍数的倍数的和,就可以得到最终的和。
def sum_of_multiples(n):
"""
数学公式,时间复杂度O(1),空间复杂度O(1)
"""
def sum_of_divisible_by(d, target):
p = target // d
return d * (p * (p+1)) // 2
return sum_of_divisible_by(3, n) + sum_of_divisible_by(5, n) - sum_of_divisible_by(15, n)
这个算法的时间复杂度是O(1),因为只需要计算几个等差数列的和,空间复杂度也是O(1)。这比暴力枚举算法的时间复杂度要小很多,因此更为高效。
对于3或5的倍数之和这个问题,我们可以用暴力枚举法或数学公式来求解。暴力枚举法的时间复杂度是O(n),而数学公式可以实现O(1)的时间复杂度。因此,在实际开发中,尽可能采用数学公式优化算法,可以大幅提升程序的效率。同时,这个问题也可以拓展到计算其他倍数的和,只需要稍作修改即可。