2023-10-17 leetcode 每日一题 倍数求和

题目内容

给你一个正整数 n ,请你计算在 [1,n] 范围内能被 3、5、7 整除的所有整数之和。

返回一个整数,用于表示给定范围内所有满足约束条件的数字之和。

示例 :

输入:n = 7
输出:21
解释:在 [1, 7] 范围内能被 3、5、7 整除的所有整数分别是 3、5、6、7 。数字之和为 21 。
提示:

提示:

1 <= n <= 103

标签

数学

思路解析 遍历:

 * 根据题意 直接遍历获取所有被 3、5、7 整除的所有整数然后求和
 *
代码1
  public int sumOfMultiples(int n) {
        int num =0;
        for (int i = 1; i <= n; i++) {
            if (i%3==0||i%5==0||i%7==0)
                num+=i;
        }
        return num;
    }

思路解析 容斥原理:

 *  在区间 [1, n] 内能被m整除的整数,一定是一个等差队列,最小为m,最大为m*n/m,个数为n/m
 * 所以求这个等差队列的和的公式就是(m*n/m+m)*n/m/2 ,就是f(n,m)=(m*n/m+m)*n/m/2
 * 然后根据容斥原理 
 * 区间 [1, n] 内能被3,5,7整除的
 *为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)
代码2
public int f(int n, int m) {
        return (m + m * n / 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);
    }

你可能感兴趣的:(leetcode,每日一题,leetcode,算法)