出处点击打开链接
给出一个数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
#include<cstdio>
int num[6] = {2,3,5,7};
int n;
int solve()
{
int ans = 0; //是那四个数的倍数的数的数量
for (int i = 1 ; i < (1<<4)-1 ; i++) //选数
{
int ant = 0; //选中数的数量
int k = 1; //记录选中数字的乘积
for (int j = 0 ; j < 4 ; j++)
{
if (i & (1<<j)) //检测第j个数有没有被选中
{
ant++;
k *= num[j];
}
}
if (ant & 1) //ant % 2 == 1 表示奇数
ans += n / k;
else
ans -= n / k;
}
return ans;
}
int main()
{
scanf ("%d",&n);
printf ("%d\n",n-solve());
return 0;
}
/*
4 = 2^4 = 16
2 3 5 7
0 0 0 0
0 0 0 1
0 0 1 0
......
1 1 1 1
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define CLR(a,b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define LL long long
int main()
{
LL n;
int num[4] = {2,3,5,7};
scanf ("%lld",&n);
LL ans = n;
int i = 1;
while (i < (1 << 4))
{
int mul = 1;
int ant = 0;
int t = i;
for (int j = 0 ; j < 4 ; j++)
{
if ((1 << j) & i)
{
ant++;
mul *= num[j];
}
}
if (ant & 1) //奇数
ans -= n / mul;
else
ans += n / mul;
i++;
}
printf ("%lld\n",ans);
return 0;
}