φ函数的值φ(x)表示小于等于x且与x互质的数
通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中pn是x的质因数
例如:x=12,φ(x)=12*(1-1/2)*(1-1/3)
#include <stdio.h>
#include <string.h>
#include <math.h>
int p[1000005];
int mark[1000005];
int prime(int n) //判断素数
{
double t=sqrt(n*1.0);
for(int i=2;i<=t;i++)
{
if(n%i==0)
return 0;
}
return 1;
}
int tot;
void findprime() //素数筛选
{
int i,j;
p[1]=2;
p[2]=3;
for(i=4;i<1000005;i++)
{
if(mark[i]==1)
continue;
if(prime(i)==1)
{
p[tot++]=i;
for(j=2;j*i<1000005;j++)
mark[i*j]=1;
}
}
}
int oula(int n) //欧拉函数
{
int i=1;
int sum=n;
while(n!=0)
{
if(p[i]>n)
break;
if(n%p[i]==0)
{
sum-=sum*(1.0/p[i]);
while(n%p[i]==0)
n/=p[i];
}
i++;
}
return sum;
}
int main()
{
int n;
tot=3;
memset(mark,0,sizeof(mark));
memset(p,0,sizeof(p));
findprime();
while(scanf("%d",&n)!=-1)
{
printf("%d\n",oula(n));
}
return 0;
}