给你一个正整数 n ,请你计算在 [1,n] 范围内能被 3、5、7 整除的所有整数之和。 返回一个整数,用于表示给定范围内所有满足约束条件的数字之和。
示例1: **输入:**n = 7 **输出:**21 **解释:**在 [1, 7] 范围内能被 3、5、7 整除的所有整数分别是 3、5、6、7 。数字之和为 21 。
示例2: **输入:**n = 10 **输出:**40 **解释:**在 [1, 10] 范围内能被 3、5、7 整除的所有整数分别是 3、5、6、7、9、10 。数字之和为 40 。
示例 3: **输入:**n = 9 **输出:**30 **解释:**在 [1, 9] 范围内能被 3、5、7 整除的所有整数分别是 3、5、6、7、9 。数字之和为 30
提示:
- 1 <= n <= 103
解法1_枚举法
考虑非常就单枚举法,用循环一个个算出来,没有过多的思考 复杂度分析
- 时间复杂度:O(n)。
- 空间复杂度:O(1)。
class Solution {
public int sumOfMultiples(int n) {
int result = 0;
for(int i = 1; i <= n; i++){
if(i % 3 == 0 || i % 5 == 0 || i % 7 ==0){
result += i;
}
}
return result;
}
}
解法2_容斥原理
考虑在区间 [1,n][1, n][1,n] 内能被数 m 整除的整数,从小到大排序后成为一个等差数列,和为:
公式解释:
[1,n]中,能被m整除的数之和,那么一个有个数,这些数字分别为m,2m,3m,nm 构成一个等差数列,首项为m,末项
,其中n除以m在代码中取整数,得到的就是数列中m倍数个数,因此可得出项数为
,等差数列固定如上
根据容斥原理,在期间[1,n]内,内被3、5和7整除的整数之和为:
class Solution {
public int f(int n, int m) {
return (m + n / m * m) * (n / m) / 2;
}
public int sumOfMultiples(int n) {
return f(n, 3) + f(n, 5) + f(n, 7) - f(n, 3 * 5) - f(n, 3 * 7) - f(n, 5 * 7) + f(n, 3 * 5 * 7);
}
}