素数思路 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;
}