素数的定义是(自己总结):只能被1和自身整除的数。
注意:
1.最小的素数是2。
2.“1”既不是素数也不是合数。
3.素数不包括负数。
一般的求解素数的方法是:
#include<iostream>
#include<math.h>
using namespace std;
bool isPrime(int n)
{
int tmp = sqrt(n);
for(int i = 2; i <= tmp; i++)
if(n % i == 0)//可以整除,证明i是n的因子
return false;
return true;
}
int main()
{
int n;
cin>>n;
for(int i = 2; i <= n; i++)
if(isPrime(i))
cout<<i<<" ";
return 0;
}
可以使用筛选法求解一定范围内的素数。
筛选法的基本思路是(自己总结)(假如求解1~N内的素数):
1.开辟一个长度为(N+1)的bool类型的数组,记作a,并且全部设置为true(下标0,1不用管,从2开始);
2.从2开始,if(a[i] == false)时,continue; if(a[i] == true)时, if(isPrime(i)),转向3, else,置false;
3.把符合2中条件的元素保留(a[i]依然保持true),并且把所有它的倍数(1,2,…)全部置false。
**注意:**筛选法一直要遍历到尾部!!(参见百度百科)
效率问题:有人说1000000以内的素数用普通法效率更高,以上筛选法效率高。没有实际测试过。
代码:
#include<iostream>
#include<math.h>
#include<malloc.h>
using namespace std;
bool isPrime(int n)
{
int tmp = sqrt(n);
for(int i = 2; i <= tmp; i++)
if(n % i == 0)//可以整除,证明i是n的因子
return false;
return true;
}
void filterPrime(int n)
{
bool *a = (bool *)malloc(sizeof(bool) * (n+1));
for(int i = 2; i <= n; i++)
a[i] = true;
for(int i = 2; i <= n; i++)
{
if(a[i] == true)
{
if(isPrime(i))
{
for(int j = i+i; j <= n; j+=i)
a[j] = false;
}
else
a[i] = false;
}
}
//显示
for(int i = 2; i <= n; i++)
if(a[i] == true)
cout<<i<<' ';
}
int main()
{
int n;
cin>>n;
filterPrime(n);
return 0;
}
因数
因数的求解可以从素数中获得启发。
求解一个数的所有因数:
#include<iostream>
#include<malloc.h>
using namespace std;
void printFactor(int n)
{
int i;
for(i = 1; i * i < n; i++)
{
if(n % i == 0)
cout<<i<<' '<<(n/i)<<endl;
}
if(i*i == n)
cout<<i<<endl;
}
int main()
{
int n;
cin>>n;
//求n的所有因数
printFactor(n);
return 0;
}