算法-质数 约数

算法-质数 约数

1.欧几里得算法(又称辗转相除法)用于计算两个数的最大公约数

//时间复杂度O(logn)
int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}

2.试除法判定质数

//时间复杂度O(sqrt(n))
bool is_prime(int x)
{
    if(x<2) return false;
    for(int i=2;i<=x/i;i++)
    {
        if(x%i==0) return false;
    }
    return true;
}

3.试除法分解质因数

//时间复杂度O(sqrt(n))
void divide(int x)
{
    for(int i=2;i<=x/i;i++)
    {
        if(x%i==0)
        {
            int s=0;
            while(x%i==0) x/=i,s++;
            printf("%d %d\\n",i,s);
        }
    }
    if(x>1)
    {
        printf("%d 1\\n",x);
    }
}

4.朴素筛法(Eratosthenes)求素数

//时间复杂度O(nlogn)
//1-x的质数个数(x/lnx)
int primes[N],cnt;	// primes[]存储所有素数
int st[N];			// st[x]存储x是否被筛掉
void get_primes(int n)
{
    for(int i=2;i<=n;i++)
    {
        if(st[i]) continue;
        primes[++len]=i;
        for(int j=i+i;j<=n;j+=i)
        {
            st[j]=true;
        }
    }
}
上一篇:力扣面试150 最长公共前缀 纵向扫描-Code


下一篇:【51单片机入门记录】A/D、D/A转换器PCF859应用