互质数的个数

题意

给你一个正整数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;
    }
};