给出一个数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))
{
//2、3、5、7
ll a_2 = a / 2;
ll a_3 = a / 3;
ll a_5 = a / 5;
ll a_7 = a / 7;
//2 * 3、2 * 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的基础上进行操作的。
头大了,一个问题往往想起来用好久,说起来只用一分钟……我的内心是拒绝的!