L1-028 判断素数

L1-028 判断素数

本题的目标很简单,就是判断一个给定的正整数是否素数。

输出格式:

输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于2的31次方的需要判断的正整数。

输出格式:

对每个需要判断的正整数,如果它是素数,则在一行中输出Yes,否则输出No。

输入样例:

2
11
111

输出样例:

Yes
No

解题思路:

素数,又称质数,是指一个大于1的数,除了1和它本身不能被其他数整除的数。
本题给的正整数m是小于2的31次方的数,2的31次方是2147483648,在int范围内。但最大值过大,如果用暴力解法易超时,可使循环到√m,因为如果存在可以被整除的数,则必定一个因数大于√m,一个因数小于√m,不然同大则乘积超出m,同小则乘积小于m。对于循环到√m,时间复杂度要比循环到m小很多。

代码模板:

  1. 暴力解法
//易超时
#include
#include
int main()
{
	int n,m;
	int i,j;
	int k;
	scanf("%d",&n);
	for(j=0;j<n;j++){
		k=1;
		scanf("%d",&m);
		if(m==1){
			k=0;
		}
		else{
			for(i=2;i<m;i++){
			    if(m%i==0){
			    	k=0;
			    	break;
			    }
			    
		    }
		}
		if(k){
			printf("Yes\n");
		}
		else{
			printf("No\n");
		}
	}
}
  1. 循环至√m(m为正整数)
#include
#include
int main()
{
	int n,m;
	int i,j;
	int k,v;
	scanf("%d",&n);
	for(j=0;j<n;j++){
		k=1;
		scanf("%d",&m);
		v=(int)sqrt((double)m);
		if(m==1){
			k=0;
		}
		else{
			for(i=2;i<=v;i++){
			    if(m%i==0){
			    	k=0;
			    	break;
			    }
			    
		    }
		}
		if(k){
			printf("Yes\n");
		}
		else{
			printf("No\n");
		}
	}
}

你可能感兴趣的:(天梯赛,c语言)