51Nod-1106质数检测
给出N个正整数,检测每个数是否为质数。如果是,输出"Yes",否则输出"No"。
Input
第1行:一个数N,表示正整数的数量。(1 <= N <= 1000) 第2 - N + 1行:每行1个数(2 <= Si <= 10^9)
Output
输出共N行,每行为 Yes 或 No。
Sample Input
5
2
3
4
5
6
Sample output
Yes
Yes
No
Yes
No
Time Limit Exceed
# include <stdio.h>
int main()
{
int z[1001] = {0},i,j,k;
char c;
scanf("%d",&z[0]);
for(i = 1;i <= z[0];i++)
{
scanf("%d",&z[i]);
scanf("%c",&c);
}
for(j = 1;j <= z[0];j++)
{
for(k = 2;k <= z[j];k++)
{
if(z[j] % k == 0)
break;
}
if(z[j] == k)
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}
Accepted
# include <stdio.h>
# include <math.h>
int main()
{
int z[1001] = {0},i,j,k;
char c;
scanf("%d",&z[0]);
for(i = 1;i <= z[0];i++)
{
scanf("%d",&z[i]);
scanf("%c",&c);
}
for(j = 1;j <= z[0];j++)
{
if(z[j] == 2 || z[j] == 3)
printf("Yes\n");
else
{
for(k = 2;k <= sqrt(z[j]);k++)
{
if(z[j] % k == 0)
break;
}
if(k > sqrt(z[j]))
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
}
return 0;
}
显然,两段代码进行比较,此次Time limit Exceed是因为代码计算量太大,所以需要改进。
判断一个数是否为素数,简单粗暴的就是从2计算到他本身,但计算量太大,简单且计算量小的为第二页代码。
原理:
一个整数( c ),它的两个因子(a,b), a * b=c,一定是一个大于sqrt( c ),一个小于sqrt( c ),所以我们只需判断从2到sqrt( c )之间的整数是否为整数(c)的因子,即可。如果都不是它的因子,那么整数(c)就是素数,反之是。