一篇搞懂素数求法

举报
璐画 发表于 2022/04/11 17:44:23 2022/04/11
【摘要】 前言这篇文章是写常考的算法之一——求解素数这种题在之前的时候,会说的特别明显,而在近几届比赛中(貌似换了出题组),题目变得会绕个弯的问你,但是大家丝毫不用慌,题目在变,内容不变,所有的算法均有解答的框架,不信你看我之前的文章:所有的算法均有固定的东西,只要掌握了框架,万变不离其宗,废话不多说,直接开整什么是素数这是百度百科的结果,搜索出来的直接就是质数,意思就是除了1和它本身,没有其他的数能...

前言

这篇文章是写常考的算法之一——求解素数

这种题在之前的时候,会说的特别明显,而在近几届比赛中(貌似换了出题组),题目变得会绕个弯的问你,但是大家丝毫不用慌,题目在变,内容不变,所有的算法均有解答的框架,不信你看我之前的文章:

所有的算法均有固定的东西,只要掌握了框架,万变不离其宗,废话不多说,直接开整

什么是素数

这是百度百科的结果,搜索出来的直接就是质数,意思就是除了1和它本身,没有其他的数能整除它,其实素数也就是质数

那么该如何求解呢?

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA55KQ55S7,size_20,color_FFFFFF,t_70,g_se,x_16

素数简单求解

这个相信大家都见过,所以直接上代码了

// 判断整数 n 是否是素数
boolean isPrime(int n) {
    for (int i = 2; i < n; i++)
        if (n % i == 0)
            // 有其他整除因子
            return false;
    return true;
}

这个求法特别简单,显而易见,但是费时费力,而且如果遇到很大的数,直接就崩了,于时,这个方法蓝桥杯显然不会常用

素数进阶求解

首先上面这种求素数的方法是绝对不高效的,如果是遇到让你求多少位上的素数且这个位很大的情况下,求解的速度很慢
这个时候就需要用到一些小技巧
也就是说,我们并不需要i 遍历到n,只需要到sqrt(n),举个例子
12=2*6
12=3*4
12=sqrt(n)*sqrt(n)//分界
12=4*3
12=6*2
就是说分界上下的一样,只不过顺序反了,所以只需要i<+sqrt(n)即可

//判断是否是素数
public static boolean f(int num){
	for(int i=2;i<=Math.sqrt(num);i++){
		if(num%2==0){
			return false;
		}
		return true;
	}
}

这种解法会极大的缩短时间,这也是我们一般会用到的解法,但是这个解法依旧不是很高效,于是乎,下面我们就不介绍更高效的解法了

练习

素数就是不能再进行等分的整数。比如:7,11。而9不是素数,因为它可以平分为3等份。一般认为最小的素数是2,接着是3,5, ...
我们假定2是第一个素数,3是第二个素数,以此类推...请你输出第666个素数的值.

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个数字,填写多余的内容将无法得分。
public class Main {
    public static void main(String[] args) {
        int n =666, count = 0, i = 2;
        while (count <= n) {
            if (isPrime(i)) {
                count++;
                if (count == n)
                    System.out.println(i);
            }
            i++;
        }
    }
 
    private static boolean isPrime(int num) {
        for (int i = 2; i <= Math.sqrt(num); i++) {
            if (num % i == 0)
                return false;
        }
        return true;
    }
}

看到这,我相信大家已经掌握了素数的求解了吧,只需要再去刷几道题就好了,加油吧少年

送给大家一句话

乾坤未定,你我皆是黑马

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。