[题] 试除法判定质数 #质数(素数) #试除法

题目

AcWing 866. 试除法判定质数


思路

首先是暴力枚举
时间:O( (n) ))

bool is_prime(int n){//朴素判定(暴力)
	if(n < 2) return 0;//小于2的数不在范围内,直接排除
	for(int i = 2; i < n; i ++)//枚举从2到n-1
		if(n % i == 0)//如果可以整除某一个数
			return 0;//就说明不是质数
	return 1;
}
时间复杂度是O(n),效率低。

优化:限定范围。
原理:约数是一对一对的,所以每次枚举较小的一个约数就好。
时间:O( sqrt(n) )

  bool is_prime(int n){//优化写法
	if(n < 2) return 0;//小于2的数不在范围内,直接排除
	for(int i = 2; i <= n / i; i ++)//当i <= n/i 时,说明还没有遍历到重复的约数组
	/*注意不要写成for(int i = 2; i * i <= n; i ++),会溢出
	  注意不要写成for(int i = 2; i <= sqrt(n); i ++),每次执行sqrt(n)都耗费时间*/
		if(n % i == 0)//如果可以整除某一个数
			return 0;//就说明不是质数
	return 1;
}

代码

#include<bits/stdc++.h>
using namespace std;

bool i(int n){//优化写法
	if(n < 2) return 0;//小于2的数不在范围内,直接排除
	for(int i = 2; i <= n / i; i ++)//枚举从到n/i
		if(n % i == 0)//如果可以整除某一个数
			return 0;//就说明不是质数
	return 1;
}
int main(){
    int n;
    cin >> n;
    while(n --){
        int a;
        cin >> a;
        if(i(a)) cout << "Yes" << endl;
        else cout << "No" << endl;
    }
    
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值