要判断自然数 x 是否质数,就不断尝试除于小于 x 且大于1的自然数,只要有一个能整除,则 x 是合数;否则,x 是质数。
只要从 2 一直尝试到√x,就可以了。因数都是成对出现的。比如,100的因数有:1和100,2和50,4和25,5和20,10和10。成对的因数,其中一个必然小于等于100的开平方,另一个大于等于100的开平方。而且只要尝试小于√x 的质数即可。
#include <iostream>
#include <vector>
using namespace std;
class Prime
{
private:
vector<int> prime{ 2 };//质数集合
public:
bool isPrime(int number)
{
int divisor = sqrt(number);
for (int i = 0; prime[i] <= divisor; ++i)
if (number%prime[i] == 0) //是否是质数
return false;
return true;
}
void insertPrime(int n)
{
int max = prime.back(); //当前集合内最大质数
if (n <= max)return;
for (int i = max + 1; i <= n; ++i)
if (isPrime(i))prime.push_back(i);
}
void printPrime(int n)
{
n = abs(n); //取绝对值
if (n == 0 || n == 1) {
cout << "不存在质数。\n"; return;
}
insertPrime(n);
for (auto& p = prime.cbegin(); p != prime.cend() && *p <= n; ++p)
cout << *p << " ";
cout << endl;
}
};
int main()
{
Prime a;
a.printPrime(1);
a.printPrime(2);
a.printPrime(100);
a.printPrime(10);
a.printPrime(-1110);
a.printPrime(3);
system("pause");
}