在数论中,对正整数n,欧拉函数ϕ(n)是小于或等于n的正整数中与n 互质的数的数目。此函数以其首名研究者欧拉命名,它又称为φ函数(由高斯所命名)
输入格式:
一个正整数n。
输出格式:
一个数,表示欧拉函数ϕ(n)。
输入样例:
10
输出样例:
4
注释:表示10以内有4个数与10 互质,它们是:1,3,7,9
ϕ(n)=ni=1∏r(1−1/pi), 其中,其中p1,p2……pr为n的所有质因数
#include<bits/stdc++.h>
using namespace std;
int sushu(int n) {
for (int i = 2;i <= (int)sqrt(n);i++) {
if (n % i == 0) return 0;
}
return 1;
}
int main() {
int a;
cin >> a;
if (sushu(a)) {
cout << a - 1;
return 0;
}
else {
int ans = a;
for (int i = 2;i <= a;i++) {
if (sushu(i)) {
if (a % i == 0) ans = ans * (i - 1) / i;
while (a % i == 0) a /= i;
}
}
cout << ans;
}
}
优化算法的心路历程:
0,素数判断
i<=(int)sqrt(n) 可以
1,通过这一步,把a变小。
到这里我已经觉得很够了。竟然还有个点超时!!
2.
我还尝试把这里i++ 变成i=i+2; i从3开始,i=2的时候单拎出来,至少内层砍了一半了吧,这总够了吧!
还超时我麻了!
3.网上找找了,原来是 先判断一下这数是不是素数若是直接cout<<a-1; return 0 ; !!!