#include <bits/stdc++.h> int main() { int i,x; scanf("%d",&x); int ans=x; for(int i=2;i*i<=x;i++){//对因子进行罗列 if(x%i) continue; ans=ans*(i-1)/i;//每次刨除一种因子 ,依次乘1/2,2/3,3/4 等等,将公因子的倍数全都除去 while(!(x%i)) { x/=i;//不断求公因子,先是12,6,3.得到3的时候2这个公因子已经结束了,找到了下一个公因子,也就跳出了while循环。 } } //由此可见,如果7行i*i改成i的话,可以直接将每一种情况算尽,但是时间太长,就取根号,再加第18行进行后补 if(x>1){ans=ans*(x-1)/x;} printf("%d",ans); }