互质数的个数
题意
给你一个正整数N(不超过 ),请你求出小于等于N的正整数中与N互质的数字的个数。
(两个整数a与b互质当且仅当它们的最大公约数为1)
解法1
可以用枚举法求出小于等于n的整数中与n互质的数的个数
时间复杂度:
空间复杂度:
代码
class Solution {
public:
/**
*
* @param n int整型
* @return int整型
*/
int gcd(int a,int b)
{
if(b==0)return a;
else return gcd(b,a%b);
}
int euler(int n) {
int ans=0;
for(int i=1;i<=n;i++)
if(gcd(i,n)==1)ans++;
return ans;
// write code here
}
};解法2
以上解法时间复杂度太高,无法通过所有测试数据。
数论函数中欧拉函数 的定义即为小于或等于n的正整数中与n互质的数的数目,
欧拉函数的计算公式为
其中 为x的所有质因数。
我们可以在对一个数进行质因数分解的同时求它的欧拉函数值。
时间复杂度:
空间复杂度:
代码
class Solution {
public:
/**
*
* @param n int整型
* @return int整型
*/
int euler(int n) {
int res = n,t=n;
for(int i=2;i*i<=t;i++)
if(n%i==0)
{
while(n%i==0)n/=i;
res=res/i*(i-1);
}
if(n>1)res=res/n*(n-1);
return res;
}
};
京公网安备 11010502036488号