编程题 7-2 开根号法判断素数

7-2 判断素数

1.题目

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

输入格式:

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

输出格式:

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

输入样例:

2
11
111
 

输出样例:

Yes
No
 
代码长度限制
16 KB
时间限制
400 ms
内存限制

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;	
}

 

posted @ 2022-10-27 17:30  许悠  阅读(448)  评论(0)    收藏  举报
浏览器标题切换
浏览器标题切换end
1 2 3
4