2652.倍数求和

124 阅读1分钟

给你一个正整数 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);
    }
}