本题是2023年10月17日每日一题
问题描述:
给你一个正整数 n
,请你计算在 [1,n]
范围内能被 3
、5
、7
整除的所有整数之和。
返回一个整数,用于表示给定范围内所有满足约束条件的数字之和。
解题思路一:暴力枚举
首先就想到的是暴力枚举了,直接初始化一个sums=0 ,然后从1开始枚举到n,看每一个数据是否能被3,5,7中的任意一个整除,能就累加到sums。
题解:
代码语言:python代码运行次数:0复制class Solution:
def sumOfMultiples(self, n: int) -> int:
sums = 0
for i in range(1,n 1):
if i % 3 == 0 or i % 5 == 0 or i % 7 == 0:
sums = i
return sums
这个时候发现运行时间很长。
再小优化一下,让i从3开始遍历,因为小于3的数不可能被整除:
代码语言:python代码运行次数:0复制class Solution:
def sumOfMultiples(self, n: int) -> int:
sums = 0
i = 3
while i >= n:
if i % 3 == 0 or i % 5 == 0 or i % 7 == 0:
sums = i
i = 1
return sums
思路二:这时尝试一下减少枚举次数,但本质上还是O(n)的算法:
由于求的是1~n的累加和,所以我们直接把从1~n关于3,5,7的倍数加起来,但是要注意去掉重复的最小公倍数,如15,21,等等。
代码语言:python代码运行次数:0复制class Solution:
def sumOfMultiples(self, n: int) -> int:
sums = 0
i = 3
while i <= n:
sums = i
i = 3
j = 5
while j <= n:
if j % 3 == 0:
# 重复则去重
j = 5
continue
sums = j
j = 5
k = 7
while k <= n:
if k % 3 == 0 or k % 5 == 0:
# 同上,重复则去重
k = 7
continue
sums = k
k = 7
return sums
还有一种数学思路解题,但不涉及编程,所以直接略过。