方法一
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
int i,j,k,n,t;
int b[32800];
scanf("%d",&n);
while(n--)
{
t=0;
memset(b,0,sizeof(b));
scanf("%d",&k);
for(j=2;j<=k;j++)
if(k%j==0)
for(i=j;i<=k;i+=j)
if(i%j==0)
b[i]=1;
for(i=1;i<k;i++)
if(b[i]==0)
t++;
printf("%d\n",t);
}return 0;
}
方法2;欧拉公式
#include <iostream>6
#include <cstdio>
#include <cmath>
using namespace std;
int eular(int x)
{
int i,res = x;
for(i = 2;i < (int)sqrt(x*1.0) + 1;i++)
if(x % i == 0)
{
res = res / i * (i-1);
while(x % i == 0)
x /= i;
}
if(x > 1)
res = res/x *(x-1);
return res;
}
int main()
{
int a,n;
freopen("in.txt","r",stdin);
cin>>a;
while(a--)
{
cin>>n;
int res = eular(n);
cout<<res<<endl;
}
return 0;
}