题目链接:3或5的倍数
解法一:暴力枚举
C语言代码
#include<stdio.h>
int main (){int sum = 0;for(int i = 0;i<1000;i++){if(i%3==0 || i%5==0)sum +=i;}printf("%d\n",sum);return 0;
}
//运行结果:233168
上面这个解法的时间复杂度为O(N),因为数据量小,所以可以使用暴力。
但如果把题目的1000变成 100 0 10000 1000^{10000} 100010000那么暴力解法的运行时间将非常高,因为需要枚举的数量会呈指数级增长。
Java代码
public class Main {public static void main(String[] args) {int sum = 0;for (int i = 0; i < 1000; i++) {if (i % 3 == 0 || i % 5 == 0) {sum += i;}}System.out.println(sum);}
}
解法二:容斥原理
容斥原理常用于解决包含多个集合的计数问题,其基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后再把计数时重复计算的数目排斥出去,使得计算的结果 既无遗漏又无重复。
本题,我们假设3的倍数的集合叫做集合A,5的倍数的集合叫做集合B。根据容斥原理,我们需要计算集合A和集合B的交集,既是3的倍数又是5的倍数的个数。
所以,根据容斥原理,我们可以使用以下公式计算交集的大小: ∣ A ∩ B ∣ = ∣ A ∣ + ∣ B ∣ − ∣ A ∪ B ∣ |A ∩ B| = |A| + |B| - |A ∪ B| ∣A∩B∣=∣A∣+∣B∣−∣A∪B∣
知道了这些,这道题就简单了。接下来,我们需要计算小于1000的自然数中所有3或5的倍数的和。
3或5的倍数的和 = 3的倍数的和 + 5的倍数的和 - 15的倍数的和
求1000以内3或5或15的倍数的和,可以使用等差数列求和公式: S = 1 2 n ( a 1 + a n ) S=\frac{1}{2} n\left ( a_{1}+ a_{n}\right ) S=21n(a1+an)
C语言代码
#include<stdio.h>
int main (){int sum3 = (3+999/3*3)*(999/3)/2;int sum5 = (5+999/5*5)*(999/5)/2;int sum15 = (15+999/15*15)*(999/15)/2;printf("%d\n",sum3+sum5-sum15);return 0;
}
Java代码
public class Main {public static void main(String[] args) {int sum3 = (3 + (999 / 3) * 3) * (999 / 3) / 2;int sum5 = (5 + (999 / 5) * 5) * (999 / 5) / 2;int sum15 = (15 + (999 / 15) * 15) * (999 / 15) / 2;int result = sum3 + sum5 - sum15;System.out.println(result);}
}