今天看算法导论 ,看到欧拉 phi 函数,发现可以对之前写过的代码进行优化,所以重写了一次代码。
欧拉函数是指:对于一个正整数 n ,小于 n 且和 n 互质的正整数(包括 1)的个数,记作 φ(n) 。
// 欧拉函数的求法:求出 n 的质因子 p1, p2, ... ,则
// EulerPHI (n) = n * (1 - 1 / p1) * (1 - 1 / p2) * ...
#include <iostream>
#include <cmath>
using namespace std;
int EulerPHI (int n)
{
if (n == 1)
{
return 1;
}
int i = 2, m = n, root = int (sqrt (double (m)));
while (i <= root)
{
if (m % i == 0)
{
n -= (n / i);
do {
m /= i;
} while (m % i == 0);
root = int (sqrt (double (m)));
}
i ++;
}
if (m != 1)
{
n -= (n / m);
}
return n;
}
void main ()
{
int n;
cin >> n;
cout << EulerPHI (n) << endl;
}
欧拉函数是指:对于一个正整数 n ,小于 n 且和 n 互质的正整数(包括 1)的个数,记作 φ(n) 。
// 欧拉函数的求法:求出 n 的质因子 p1, p2, ... ,则
// EulerPHI (n) = n * (1 - 1 / p1) * (1 - 1 / p2) * ...
#include <iostream>
#include <cmath>
using namespace std;
int EulerPHI (int n)
{
if (n == 1)
{
return 1;
}
int i = 2, m = n, root = int (sqrt (double (m)));
while (i <= root)
{
if (m % i == 0)
{
n -= (n / i);
do {
m /= i;
} while (m % i == 0);
root = int (sqrt (double (m)));
}
i ++;
}
if (m != 1)
{
n -= (n / m);
}
return n;
}
void main ()
{
int n;
cin >> n;
cout << EulerPHI (n) << endl;
}