判断一个数是否为素数
题目描述:
素数在数论中有着很重要的地位。比1大但不是素数的数称为合数。1和0既非素数也非合数。质数是与合数相对立的两个概念,二者构成了数论当中最基础的定义之一。基于质数定义的基础之上而建立的问题有很多世界级的难题,如哥德巴赫猜想等。算术基本定理证明每个大于1的正整数都可以写成素数的乘积,并且这种乘积的形式是唯一的。这个定理的重要一点是,将1排斥在素数集合以外。如果1被认为是素数,那么这些严格的阐述就不得不加上一些限制条件。
概念
只有1和它本身两个约数的自然数,叫质数(Prime Number)。(如:由2÷1=2,2÷2=1,可知2的约数只有1和它本身2这两个约数,所以2就是质数。与之相对立的是合数:“除了1和它本身两个约数外,还有其它约数的数,叫合数。”如:4÷1=4,4÷2=2,4÷4=1,很显然,4的约数除了1和它本身4这两个约数以外,还有约数2,所以4是合数。)
100以内的质数有2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,在100内共有25个质数。
注:
(1)1既不是质数也不是合数。因为它的约数有且只有1这一个约数。
(2)2和3是所有素数中唯一两个连着的数 .
解题思路:
- 方法一:暴力法
- 从(2~N-1),看是否能被其中任何数整除,若能的话,则不为素数
- 方法二:空间换时间
- 从2开始到N,记录中间遇到的每一个素数,则N仅需要判断是否能被小于他的素数整除即可
代码实现
#include <iostream>
#include <vector>
using namespace std;
void print(bool flag)
{
if (flag) {
cout << "\\t" << endl;
} else {
cout << "\\n" << endl;
}
}
int main()
{
int numbers = 0;
cin >> numbers;
if (numbers > 30000 || numbers <= 0) {
cout << "Error input" << endl;
return 0;
}
if (numbers < 2) {
print(false);
return 0;
} else if (numbers == 2) {
print(true);
return 0;
}
vector<int> primes;
int middle = numbers >> 2;
int current = 2;
primes.push_back(current);
bool flag = false;
while (++current <= middle) {
flag = true;
for (vector<int>::iterator iter = primes.begin(); iter != primes.end(); iter++) {
if (current % *iter == 0) {
flag = false;
break;
}
}
if (flag) {
primes.push_back(current);
}
}
flag = true;
for (vector<int>::iterator iter = primes.begin(); iter != primes.end(); it