给出一个 n <= 10亿 ,求出在 1 ~ n 范围内能被 3 或 5 整除的数的和 !!!!!运行时间 <= 2 s 内。
第一种解法,费时:
long long sum = 0 ;
for (int k = 1; k <= n; k++) {
if (k%3 == 0 || k%5 == 0) {
sum += k ;
}
}
printf(" %lld\n", sum);
第二种解法,高效:
long long sum = 0 ;
for (int i = 1; i*3 <= n ; i++) {
if (i % 5 != 0 ) {
sum += i*3 ;
}
if (i*5 <= n) {
sum += i*5 ;
}
}
long long n = 1000000000 ;
long long sum = 0 , k3 , k5 , k15 , m3 , m5 , m15 ;
k3 = n / 3 ;
k5 = n / 5 ;
k15 = n / 15 ;
m3 = 3 * k3 * (k3 + 1) / 2 ;
m5 = 5 * k5 * (k5 + 1) / 2 ;
m15 = 15 * k15 * (k15 + 1) / 2 ;
sum = m3 + m5 - m15 ;