#include<stdio.h>
#include<math.h>
int gcd(int n)//这里可以直接利用欧拉函数的性质:小于n并与n互质的数的个数
{
int i,j,ans=n;
for(i=2;i<=sqrt(n);i++)//i的范围是这些,判断n是否是质数时就是判断到sqrt(n)就可以。这里跳出循环可以判断n已经是1或者质数了
if(n%i==0)
{
ans=ans/i*(i-1);
while(n%i==0)n/=i;//这里可以保证i一定会是素数,因为下次出现i的倍数的时候不会进去这个循环
}
if(n>1)ans=ans/n*(n-1);//有可能除到最后 本身还是一个质因子
return ans;
}
int main()
{
int n;
while(scanf("%d",&n),n)
printf("%d\n",n-1-gcd(n));
return 0;
}
简单的欧拉函数模板套用
自己写的
#include<stdio.h>
int euler(int n)
{
int ret=n,i;
for(i=2;i*i<=n;i++)
if(n%i==0)
{
ret=ret-ret/i;
while(n%i==0)
n/=i;
}
if(n>1) ret=ret-ret/n;
return ret;
}
int main()
{
int n;
while(scanf("%d",&n),n)
printf("%d\n",n-1-euler(n));
}