自学内容网 自学内容网

算法-质数 约数

算法-质数 约数

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;
        }
    }
}

原文地址:https://blog.csdn.net/m0_67673651/article/details/137697334

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!