解题思路:
使用容斥原理;
1.求出所有1~N中所有为2的倍数,3的倍数,5的倍数,7的倍数的个数,在求得的结果中肯定有些是重复的;
2.要减去第一步中重复的哪些数字。如何求重复的那些数字呢?求两两的最小公倍数。
例如:1~N中满足2的倍数的个数有N/2个,满足3的倍数的个数有N/3个,既满足2的倍数有满足3的倍数的个数为N/6个,
则1~N中是2,3的倍数的个数为N/2+N/3-N/6。
后面也用同样的方法,直到最后所有数的最小公倍数只有1个时,就不用接着往下算啦!(看了代码后一目了然)
源码附上:
#include <iostream>
using namespace std;
int main()
{
long long N,cnt=0;
int i;
cin>>N;
cnt += (N/2 + N/3 + N/5 + N/7);
cnt -= (N/6 + N/10 + N/14 + N/15
+ N/21 + N/35);
cnt += (N/30 + N/42 + N/70 + N/105);
cnt -= (N/210);
cout << N - cnt<<endl;
return 0;
}