任何一个大于1的自然数 N,如果N不为质数,那么N可以唯一分解成有限个质数的乘积 ,如:n=p1^a1p2^a2…pn^an
如果某个数字是p的倍数,你无法知道这个数字是p^x或者p^y,所以要把p在n范围内的每个倍数都要询问一次,每个素数都要这样询问,这样就可以确定1-n的任意一个数字了。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1010;
bool isPrime[MAXN];
void getPrime(int n)
{
isPrime[0] = isPrime[1] = true;
for(int i = 2; i <= n; ++i)
{
if(!isPrime[i])
{
for(int j = i+i; j < MAXN; j += i)
isPrime[j] = true;
}
}
}
int main()
{
int n;
cin >> n;
getPrime(n);
int res = 0;
for(int i = 1; i <= n; ++i)
{
if(!isPrime[i])
{
int p = i;
while(p <= n)
{
p *= i;
++res;
}
}
}
cout << res <<endl;
return 0;
}