您的位置:首页 > 编程语言 > C语言/C++

素数心得

2016-08-09 23:08 465 查看
素数思路  PS  可以从3开始每次加2进行判断构造素数数组
 毕竟偶数都是合数

1、正常暴力解法

//从2到n进行一一判断

bool fn(int i)
{
if(i==2)
return true;

for(int n=2;n<i;++n)
{
if(i%n==0)
return false;
}
return true;
}


改进  判断的集合减少一半   时间减少一半  n/2

bool fn(int i)
{
if(i==2)
return true;

for(int n=2;n<=i/2;++n)
{
if(i%n==0)
return false;
}
return true;
}


改进 集合减少至2到sqrt(n) 时间从n/2到开方(n)

bool fn(int i)
{
if(i==2)
return true;

for(int n=2;n<=sqrt(i)++n)
{
if(i%n==0)
return false;
}
return true;
}


2、如果先存有了素数数组  那么可以利用素数数组进行判断。(借鉴了网上大神的思路)

 
素数数组p[]={2,3,5,7,....}
例如x=10  x%2==0  所以x为合数
X=11 x%2!=0 x%3!=0 x%5!=0 x%7!=0  所以11是素数  添加到数组最后

//构造一个素数数组
void makePrimes(int primes[], int num)
{
int i, j, cnt;

primes[0] = 2;
primes[1] = 3;

for(i = 5, cnt = 2; cnt < num; i += 2)
{
int flag = true;
for(j = 1; primes[j]*primes[j] <= i; ++j)
{
if(i%primes[j] == 0)
{
flag = false; break;
}
}
if(flag) primes[cnt++] = i;
}
}

//判断是否为素数
bool isPrime(int primes[], int n)
{
if(n < 2) return false;

for(int i = 0; primes[i]*primes[i] <= n; ++i)
if(n%primes[i] == 0) return false;

return true;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++简单算法