编程题 7-2 开根号法判断素数
7-2 判断素数
1.题目
本题的目标很简单,就是判断一个给定的正整数是否素数。
输入格式:
输入在第一行给出一个正整数N( 10),随后N行,每行给出一个小于的需要判断的正整数。
输出格式:
对每个需要判断的正整数,如果它是素数,则在一行中输出Yes,否则输出No。
输入样例:
2
11
111
输出样例:
Yes
No
2.分析
首先,素数(prime number)定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,素数有无穷多个。1不是素数。需要单独对1分情况。
那么如何判断一个数是不是素数?有以下几种方法。
第一种,最简单的方法:从2到n-1每个数均整除判断。
int isPrime(int k){ int j; for ( j=2; j<k; j++ ) { if(k%j==0) // 如果不为素数返回0 { return 0; } } return 1; // 反之则返回1 }
但是这种方法可能会超时。
第二种,开根号法:从2到根号n均整除判断。
素数的因子为1和本身, 如果数c不是素数,则还有其他因子,其中的因子,假如为数a,b,其中必有一个大于sqrt(c) ,一个小于sqrt(c) 。所以数c必有一个小于或等于其平方根的因数,那么验证素数时就只需要验证到其平方根就可以了。即
一个合数一定含有小于它平方根的质因子。
int isPrime(int n){ int i; for ( i=2; i<=sqrt(n); i++ ) { if(n%i==0) // 如果不为素数返回0 { return 0; } } return 1; // 反之则返回1 }
使用sqrt()函数可以避免超时。sqrt()函数的参数与返回类型都是double。因为sqrt()函数,里面的形参是double型的,所以调用的时候,要强制转换成double型。sqrt()函数的输入参数不允许为负数。既然用到了函数,头文件要加上#include <math.h>。
还有一种是筛选法。待补充。
3.代码
#include <stdio.h>
#include <math.h>
int main()
{
int n,m,i,j;//n指最大个数。用m指代依次被读入的数。
scanf("%d",&n);
for(i=0;i<n;i++)//记得对i初始化。
{
scanf("%d",&m);
if(m==1)//下面的循环从2开始,1不是素数,所以把1这种情况单独拎出来。
puts("No");/*puts() 功能是将字符串输出到屏幕。
输出时只有遇到 '\0' 也就是字符串结束标志符才会停止。
使用 puts() 显示字符串时,系统会自动在其后添加一个换行符。
puts() 虽然简单、方便,但也仅限于输出字符串,功能还是没有 printf() 强大。*/
else
{
for(j=2;j<=sqrt(m);j++)//开根号,避免超时
if(m%j==0)//一个数被它的开方整除,这个数不是素数。
break;//本次循环结束。
if(j>sqrt(m))
puts("Yes");
else
puts("No");
}
}
return 0;
}

浙公网安备 33010602011771号