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小很多。
代码模板:
- 暴力解法
//易超时
#include<stdio.h>
#include<math.h>
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");
}
}
}
- 循环至√m(m为正整数)
#include<stdio.h>
#include<math.h>
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");
}
}
}