#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));
}