1,使用欧拉现行筛法将素数选出来并保存
2,O(1)判断一个数是否是素数
3,不需要判断非素数的幂,保证每个参与运算的数都是素数
#include<iostream> #include<iomanip> #include<algorithm> #include<math.h> #include<string.h> #include<time.h> using namespace std; const int N=1e8+10; //此时有5761456个素数 bool boo[N]; //等于0则是素数 int p[6000000]; //素数表 //欧拉线性筛法 void prim() { int k=0; 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++) // p素数表,省去判断非素数 { if(n%p[i]==0) { do { sum++; n/=p[i]; } while(n%p[i]==0); } } return sum; } int main() { clock_t start, finish; //c++程序运行时间计算 start=clock(); prim(); int n; while(cin>>n) { if(boo[n]==0) cout<<'1'<<endl; //素数判断,如果是素数就直接输出1 else cout<<phi(n)<<endl; //否则则素数表执行 } finish=clock(); cout<<"耗费时间"<<(double)(finish-start)<<"ms"<<endl; return 0; }