2 25608 24027
7680 16016
#include<stdio.h> #include<string.h> #define size 40000 int Euler[size]; void euler() { int i,j; memset(Euler,0,sizeof(Euler)); Euler[1]=1; for(i=2;i<size;i++)//打表求欧拉函数 { if(!Euler[i]) for(j=i;j<size;j+=i) { if(!Euler[j]) Euler[j]=j; Euler[j]=Euler[j]/i*(i-1); } } } int main() { int n,m ; scanf("%d",&n); while(n--) { euler(); scanf("%d",&m); printf("%d\n",Euler[m]); } }直接针对性的求,不打表:
#include<stdio.h> #include<string.h> #define size 40000 int euler(int n) { int i,j; int ret=n; for(i=2;i*i<=n;i++) { if(n%i==0) { ret=ret/i*(i-1);//先除后乘,防止溢出 while(n%i==0) n/=i; } }if(n>1) ret=ret/n*(n-1); return ret; } int main() { int n,m ; scanf("%d",&n); while(n--) { scanf("%d",&m); printf("%d\n",euler(m)); } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/zhangxiaoxiang123/article/details/48008643