给出一个数N,求1至N中,有多少个数不是2 3 5 7的倍数。 例如N = 10,只有1不是2 3 5 7的倍数。
Input
输入1个数N(1 <= N <= 10^18)。
Output
输出不是2 3 5 7的倍数的数共有多少。
Input示例
10
Output示例
1

一道特别烧脑子的数学题,毕竟我数学不是太用功,用到了容斥原理,对重复的减的加回来,对重复加的也要减去。

代码(C):

#include <stdio.h>
#include <string.h>
typedef long long ll;

int main(int argc, const char * argv[])
{
    long long a;

    while (~scanf("%lld", &a))
    {
        //2357
        ll a_2 = a / 2;
        ll a_3 = a / 3;
        ll a_5 = a / 5;
        ll a_7 = a / 7;

        //2 * 32 * 5......
        ll a_6 = a / 6;
        ll a_10 = a / 10;
        ll a_14 = a / 14;
        ll a_15 = a / 15;
        ll a_21 = a / 21;
        ll a_35 = a / 35;

        //2 * 3 * 5......
        ll a_30 = a / 30;
        ll a_42 = a / 42;
        ll a_70 = a / 70;
        ll a_105 = a / 105;

        //2 * 3 * 5 * 7
        ll a_210 = a / 210;

        ll ans = a - a_2 - a_3 - a_5 - a_7 + a_6 + a_10 + a_14 + a_15 + a_21 + a_35 - a_30 - a_42 - a_70 - a_105 + a_210;

        printf("%lld\n", ans);
    }

    return 0;
}

先减去2、3、5、7的倍数的个数,然后加上两两相乘的倍数的个数,再减去三三相乘的倍数的个数,最后加上2*3*5*7的倍数的个数。当然,是在a的基础上进行操作的。

头大了,一个问题往往想起来用好久,说起来只用一分钟……我的内心是拒绝的!