目录
一.常规方法
二.进阶方法
三.代码示例(运用进阶方法)
质数是整数且仅能被自身和1整除
一.常规方法
所以我们根据质数的这个定义便可用以下思路判断:设需要检测的数为x。y为除1和自己的除数
逐步检测x是否可被y整除,如x被y整除,则x为合数,否则为质数
整理以下就有如下函数:
bool primeNumber(int n){for(int i=2;i<n;i++){//因为质数仅能被自身和1整除,所以除数可以从2开始 if(n%i==0)return false;//能被其他数整除 }return true;
}
二.进阶方法
有了上述代码,我们不妨仔细想想:设需要检测的数为x,除数为y
因为,所以如果ab=x,那么a、b中一个数一定大于等于,另一个一定小于等于,那么我们只需要判断i<=的情况即可
为了得到,这里需要用到sqrt()函数,用来开方,它存在于#include<math.h>和#include<cmath>中,primeNumber()函数改进如下:
bool primeNumber(int n){for(int i=2;i<sqrt(n);i++){//因为质数仅能被自身和1整除,所以除数可以从2开始 if(n%i==0)return false;//能被其他数整除 }return true;
}
这样做的话有如下好处:设需要检测的数为x
如果遇到合数时,方法二运算时间和方法一相同(因为方法一是一遇到能被除1和自己的除数整除的情况时便退出,和方法二相同);但是如果遇到质数时,方法二则会节省比方法一的一半还多的时间(方法一因为没有能被除1和自己的除数整除的情况,所以要判断x-1个数;方法二仅需要判断少于x/2个数),所以建议采用方法二
三.代码示例(运用进阶方法)
为了让c/c++的朋友都看懂,我将采用c语言来写这个程序:
#include<stdio.h>
#include<cmath>
bool primeNumber(int n){for(int i=2;i<sqrt(n);i++){//因为质数仅能被自身和1整除,所以除数可以从2开始 if(n%i==0)return false;//能被其他数整除 }return true;
}
int main(){int n;scanf("%d",&n);if(primeNumber(n))printf("质数\n");else printf("合数\n");
}
运行结果:
如有疑惑欢迎评论区留言或私信!