试除法判断质数
质数
什么是质数:存在一个数 ,若 只能被 和 整除,不再有其他的因数,称为质数(素数),否则称为合数。若 , 既不是质数,也不是合数。
判定质数——试除法
从定义出发,枚举每个 ,若 ( 能被 整除 ),则 不是质数。时间复杂度是 的。
如果 ( 整除 ) ,那么 ( 除 的商也能整除 )的。比如 的时候, 可以整除 , 也可以整除 。可以发现 的约数都是成对出现的,我们在枚举的时候,可以只枚举每一对中较小的那个: ,化简后 。时间复杂度从 降到了 。
题目描述
给定 个正整数 ,判定每个数是否是质数。
输入格式
第一行包含整数 。
接下来 行,每行包含一个正整数 。
输出格式
共 行,其中第 行输出第 个正整数 是否为质数,是则输出 Yes,否则输出 No。
数据范围
,
样例
输入样例:
2
2
6
输出样例:
Yes
No
代码
暴力版
暴力做法,时间复杂是 的。
C++
#include <iostream>
using namespace std;
bool is_prime(int n)
{
if ( n < 2 ) return false;
for ( int i = 2; i < n; i ++ )
if ( n % i == 0 ) return false;
return true;
}
int main()
{
int T;
cin >> T;
while ( T-- )
{
int n;
cin >> n;
cout << (is_prime(n) ? "Yes" : "No") << endl;
}
return 0;
}
Java
import java.util.*;
public class Main
{
static Scanner in = new Scanner(System.in);
public static void main(String args[])
{
int T = in.nextInt();
while ( T-- > 0 )
{
int n = in.nextInt();
System.out.printf("%s\n", is_prime(n) ? "Yes" : "No");
}
}
public static boolean is_prime(int n)
{
if ( n < 2 ) return false;
for ( int i = 2; i < n; i ++ )
if ( n % i == 0 ) return false;
return true;
}
}
优化版
优化后,时间复杂是 的。
for ( int i = 2; i <= n / i; i ++ ),这里可能有下面几种写法
for ( int i = 2; i <= sqrt(n); i ++ )。不推荐,每次循环后,都会执行判断条件,所以每次都会调用sqrt()函数,比较耗时间。
for ( int i = 2; i * i <= n; i ++ )。存在数据溢出的风险。
C++
#include <iostream>
using namespace std;
bool is_prime(int n)
{
if ( n < 2 ) return false;
for ( int i = 2; i <= n / i; i ++ )
if ( n % i == 0 ) return false;
return true;
}
int main()
{
int T;
cin >> T;
while ( T-- )
{
int n;
cin >> n;
cout << (is_prime(n) ? "Yes" : "No") << endl;
}
return 0;
}
Java
import java.util.*;
public class Main
{
static Scanner in = new Scanner(System.in);
public static void main(String args[])
{
int T = in.nextInt();
while ( T-- > 0 )
{
int n = in.nextInt();
System.out.printf("%s\n", is_prime(n) ? "Yes" : "No");
}
}
public static boolean is_prime(int n)
{
if ( n < 2 ) return false;
for ( int i = 2; i <= n / i; i ++ )
if ( n % i == 0 ) return false;
return true;
}
}
