效率呀。。。
下面是一份AC通过的代码:
#include <stdio.h>
using namespace std;
#define N 100000001
int euler(int n)
{
int ans=1;
int i;
for(i=2;i*i<=n;i++)
{
if(n%i==0)
{
n/=i;
ans*=i-1;
while(n%i==0)
{
n/=i;
ans*=i;
}
}
}
if(n>1)
ans*=n-1;
return ans;
}
int main()
{
int n;
while(scanf("%d",&n),n)
{
printf("%d\n",n-1-euler(n));
}
return 0;
}
和
#include <stdio.h>
int main()
{
int n;
while(1)
{
scanf("%d",&n);
int n0;
int n1;
int i;
if(n==0)break;
n0=1;
n1=n;
for(i=2;i*i<=n;i++) // 这里用i*i<=n,【1】i*i; 【2】n
{
if(n%i==0)
{
n0 *= (i-1);//(1-1.0/i);
n/=i;
while(n%i==0)
{
n/=i;
n0*=i;
}
}
}
if(n>1) // 质数的处理,不只是最初的n为质数的情况会用到,其因子为质数的时候也会用到。如14=2*7,7的时候
{
n0*=n-1;
}
printf("%d\n",n1-1-(int)n0 );
}
return 0;
}