算法基础课第四讲——数学知识——质数
题目: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;
}