思路:
1.使用欧拉现行筛法将素数选出来并保存
2.O(1)判断一个数是否是素数
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<math.h>
#include<string.h>
#include<time.h>
using namespace std;
const int N=1e8+10;
bool boo[N];
int p[6000000];
int k=0;
void prim()
{
memset(boo,0, sizeof(boo));
boo[0]=boo[1]=1;
for(int i=2; i<N; i++)
{
if(!boo[i])
{
p[k++]=i;
}
for(int j=0; j<k && i*p[j]<N; j++)
{
boo[i*p[j]]=1;
if(!(i%p[j])) break;
}
}
}
int phi(int n)
{
int sum=0;
for(int i=0; p[i]<=n; i++)
{
if(n%p[i]==0)
{
do
{
sum++;
n/=p[i];
}
while(n%p[i]==0);
}
}
return sum;
}
int main()
{
clock_t start, finish;
start=clock();
prim();
int n;
while(cin>>n)
{
if(boo[n]==0) cout<<'1'<<endl;
else cout<<phi(n)<<endl;
}
finish=clock();
cout<<"耗费时间"<<(double)(finish-start)<<"ms"<<endl;
return 0;
}