数学知识——试除法判定质数

算法基础课第四讲——数学知识——质数

题目:866.试除法判定质数

给定 n 个正整数 ai,判定每个数是否是质数。

输入格式

第一行包含整数 n。

接下来 n 行,每行包含一个正整数 ai。

输出格式

共 n 行,其中第 i 行输出第 i 个正整数 ai 是否为质数,是则输出 Yes,否则输出 No

数据范围

1≤n≤100,
1≤ai≤231−1

输入样例:

2
2
6

输出样例:

Yes
No

 素数题真的很容易超时

传统写法:
    1、 for(int i=2;i<sqrt(n);i++),
     这种写法改成int x=sqrt(n);for(int i=2;i<=x;i++)可以减少一点运行时间,但是还是容易超时
    但是会容易超时,尤其sqrt(n),这个函数运行很慢,每次执行都要运算一遍sqrt()
    
    2、或者for(int i = 2; i * i < n; i++)
     这种写法,i已经即将超过int的范围,这时候i再来个平方,妥妥超时
    
改进后的写法:

    for (int i = 2; i <= n / i; i++)
    用的也是根号的原理,但是不会超时了
    但是记得不要写成 i < n / i ,记得有个等号

错误写法:

#include<iostream>
#include<cstring>
using namespace std;
#define MAX 1000000000

bool isprime[MAX];

void sushu()
{
	memset(isprime, true, sizeof isprime);

	for (int i = 2; i < MAX; i++)
	{
		if (isprime[i])
		{
			for (int j = i + i; j < MAX; j += i)
			{
				isprime[j] = false;
			}
		}
	}
}

int main()
{
	int n, x;
	sushu();//调用素数判断函数
	cin >> n;
	while (n--)
	{
		cin >> x;
		if (isprime[x])
		{
			cout << "Yes" << endl;
		}
		else
		{
			cout << "No" << endl;
		}
	}
	return 0;
}

AC代码:

记得素数判断函数,要 if ( n < 2 )特判一下,没有这个条件会出错

#include<iostream>
#include<cstring>
using namespace std;

//素数判断函数
bool isprime(int n)
{
	//特判一下
	if (n < 2)
	{
		return false;
	}

	//记得不要写成i<n/i;
	for (int i = 2; i <= n / i; i++)
	{
		if (n % i == 0)
		{
			return false;
		}
	}
	return true;
}

int main()
{
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		int x;
		cin >> x;
		if (isprime(x))
		{
			cout << "Yes" << endl;
		}
		else
		{
			cout << "No" << endl;
		}
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值