数论之————素数

素数又叫质数,一个数除了1和他本身没有其他因子的叫素数。

最一般的判断素数写法:

bool prime(int x)
{
   if(x<=1) return false;
   for(int i=2;iif(x%i==0)
     return false;
   }
   return true;
}

快点的n开平方的复杂度

bool prime(int x)   //这是开平方的写法,减小了查询范围。
{
  if(x<=1) return false;
  for(int i=2;i<=sqrt(x)+0.5;i++)
  {
     if(x%i==0)
     return false;
  }
  return true;
}

bool prime(int x)   //这是乘的写法,让i相乘去和x比较
{
  if(x<=1) return false;
  for(int i=2;i*iif(x%i==0)
     return false;
  }
  return true;
}

如果让求1~n内的所有素数怎么快速高效求出呢?

这就需要埃式筛选,简称埃筛。
代码:

const int MAX_N=1e5;
int prime[MAX_N];   //记录素数
bool isprime[MAX_N];    //为true表示i为素数
void sieve(int n)
{
    int p=0;
    for(int i=0;i<=n;i++) isprime[i]=true;    //初始化
    isprime[0]=isprime[1]=false;
    for(int i=2;i<=n;i++)
    {
        if(isprime[i])
        {
            prime[p++]=i;
            for(int j=2*i;j<=n;j+=i)     //如果i是素数,那么i的倍数都不是素数
            isprime[j]=false;       
        }
    }
}

求n的质因子

int m[1000];
void init(int n)  //N的质因子打表
{
  int k=0;
    for(LL i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            m[k++]=i;
            while(n%i==0)
                n/=i;
        }
    }
    if(n>1)
        m[k++]=n;
}

你可能感兴趣的:(ACM,ACM_数论)