小于x且与x互素的正整数的个数
如果x为素数,则欧拉函数等于x-1
求法:将x分解为p1^n1*p2^n2*…pk^nk,则
欧拉函数=x*(1-1/p1)*(1-1/p2)…*(1-1/pk);
代码如下:
#include<iostream> using namespace std; #include<string.h> #include<math.h> #define M 10000 int p[M],a[M+1],p1[M]; void prime() { memset(a,0,sizeof(a)); int i,j,k=0,m; m=(int)(sqrt(M*1.0)); for(i=2;i<=m;i++) { if(!a[i]) { p[k++]=i; for(j=i*i;j<=M;j+=i) a[j]=1; } } for(i=m+1;i<=M;i++) if(!a[i]) p[k++]=i; } bool is_prime(int n) { if(n<=1)return false; else { int m=(int)(sqrt(n*1.0)); for(int i=2;i<=m;i++) if(n%i==0)return false; return true; } } int main() { int n; prime(); while(1) { cin>>n; int i,k=0; double s=1.0*n; if(is_prime(n)) s=s-1; else { for(i=0;p[i]<=n/2;i++)//找出质因子 经过分析只需p[i]<=n/2即可 { if(n%p[i]==0) p1[k++]=p[i]; } for(i=0;i<k;i++) { s=s*(1.0-1.0/p1[i]); } } printf("%.0lf\n",s); } return 0; }