c/c++ 判断质数(素数)

目录

注意事项:1既不是质数也不是合数!

一.常规方法

二.进阶方法

三.代码示例(运用进阶方法)


质数是整数且仅能被自身和1整除

注意事项:1既不是质数也不是合数!

所以在输入后要进行特判,判断输入的数(n)是否为1,并退出程序,不参与后面的判断:

if(n==1){
	printf("1既不是质数也不是合数\n");
	return 0;
}

一.常规方法

所以我们根据质数的这个定义便可用以下思路判断:设需要检测的数为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

因为eq?x%3D%5Csqrt%7By%7D.%5Csqrt%7By%7D,所以如果ab=x,那么a、b中一个数一定大于等于eq?%5Csqrt%7By%7D,另一个一定小于等于eq?%5Csqrt%7By%7D,那么我们只需要判断i<=eq?%5Csqrt%7By%7D的情况即可

为了得到eq?%5Csqrt%7By%7D,这里需要用到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(n==1){
		printf("1既不是质数也不是合数\n");
		return 0;
	}
	if(primeNumber(n))printf("质数\n");
	else  printf("合数\n");
}

运行结果:

5015798fb95541078ebbe68e6897ac69.png

如有疑惑欢迎评论区留言或私信! 

猜你喜欢

转载自blog.csdn.net/dfr110719/article/details/139029478