突然想到一道简单题,但也有深意!!

来源:互联网 发布:java thread import 编辑:程序博客网 时间:2024/05/01 16:34

  给出一个 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 ;



原创粉丝点击