素数:
百度百科:质数(prime number)又称素数,有无限个。质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数。
维基百科的定义为:A prime number (or a prime) is a natural number greater than 1 that has no positive divisors other than 1 and itself. A natural number greater than 1 that is not a prime number is called a composite number.
根据这一定义我们可以实现最基础的素数晒法:
从大于一(i=2)开始,到number-1的位置截止,如果存在和这其中的数字mod,存在等于0时候,说明这个数为非素数。
但是,我们要注意输入的数字(number)不一定是大于一的数字,所以要判断是否大于一,若不成立在也为非素数。
代码实现:
#include <iostream>
using namespace std;
bool Is_Prime(int number){
if (number<2) {//如果数字小于二时,为非素数
return false;
}
for (int i=2; i<number; i++) {
if (number%i==0) {//从2~(n-1)过程中如果取mod等于0不满足要求
return false;
}
}
return true;//排除所有可能之后,就可以得到为素数的可能
}
int main(int argc, const char * argv[]) {
int number;
while (scanf("%d",&number)) {
if (Is_Prime(number)) {
printf("YES!\n");
}
else{
printf("NO\n");
}
}
return 0;
}
由此我们可以发现,如果这个数为偶数且大于二的时候,那么这个数肯定不为素数,所以函数可以的到基础优化,即:
bool Is_Prime(int number){
if (number<2) {//如果数字小于二时,为非素数
return false;
}
else if (number>2&&number%2==0){
return false;
}
for (int i=2; i<number; i++) {
if (number%i==0) {//从2~(n-1)过程中如果取mod等于0不满足要求
return false;
}
}
return true;//排除所有可能之后,就可以得到为素数的可能
}
由此我们可以发现,如果一个数如果与自己小的所有 素数取mod,也都不为零时候,(本处应该运用递归的思路,由2的时候,所有的除去2以外的偶数(即2的倍数),当为其他的素数同理)。所以我们可以实现代码:
#include <iostream>
using namespace std;
int prime[10000]={2,3,5,7},n=4;//初始化数组
void Find_Prime(void){
int flag=0;
for (int number=8; number<10000; number++) {//从比素数数组中最大的数开始晒
flag=1;
for (int i=0; i<n; i++) {
if (number%prime[i]==0) {//如果与数组中的数据为这个数的倍数,那么就不是素数
flag=0;
}
}
if (flag) {
prime[n]=number;//如果是素数那么就存储
n++;
}
}
}
int main(int argc, const char * argv[]) {
Find_Prime();
for (int i=0; i<n; i++) {
printf("%d ",prime[i]);
}
return 0;
}
此外,还有,如果一个数据他的根号数k =(int)sqrt(number),如果k^2都小于number了那么(k+1)*k也肯定不能为这个数,所以我们只需要判断到这个数的根号就可以。
由此我们可以得到令一个素数晒法:
代码:
#include <iostream>
#include <math.h>
using namespace std;
bool Is_Prime(int num){
int k = (int)sqrt(num);//求出根号number
for (int i = 2; i<=k; i++) {//从2~K开始晒
if (num%i==0) {//
return false;
}
}
return true;
}
int main(int argc, const char * argv[]) {
int num;
while (scanf("%d",&num)) {
if (Is_Prime(num)) {
printf("YES\n");
}
else{
printf("NO\n");
}
}
return 0;
}
这就是我目前已知的素数晒法。