A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

Vaugely

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

© Vaugely 初级黑马   /  2018-5-20 22:27  /  2364 人查看  /  31 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Vaugely 于 2018-5-20 22:35 编辑

大家好我是java 89期学员~给大家分享一下 布尔质数筛选法质数算法主要作用于应用程序加密领域,因为它的无序,无规则,所以给程序加密破解难度极大.
因为质数是没有规律的,而计算机擅长于计算有规律的东西,我们可以换一个思路,让电脑去选则非质数,
其实就是让电脑去遍历合数,那么把合数设为true,剩下的就全都是质数了.源代码在下面,大家可以尝试运行下~
import java.util.Scanner;
// import java.util.concurrent.TimeUnit;

public class 质数算法
{
        public static void main (String [] args)
        {
               
                System.out.println("\n");
                System.out.println("请输入你需要计算质数的范围: (请勿输入超过20亿的数字)");
                Scanner cr=new Scanner(System.in);
                int n=cr.nextInt();
                //素数筛选法 通过bool数组来把非质数筛选掉
                boolean[] num=new boolean[n+1];
                //先制定两个非质数 0 和1
                int n2 = 2;
                num[0] = true;
                num[1] = true;
                //程序计时开始
                long startTime = System.currentTimeMillis();
                //以取余的思路,被除数只需要到递增到 除数的平方根即可
                for (int i = 2; i * i < n + 1; i++)
                {
                        //如果这个数没有被标记为非质数那么就进行推算
                        if (!num)
                        {
                                for (int j = i; j <= n - i; j += i)
                                {
                                        if (!num[j + i])
                                        {
                                                //此处把推算的非质 全部设为true
                                                num[j + i] = true;
                                                //用于统计非质
                                                n2++;
                                        }
                                }
                        }
                }
                long endTime = System.currentTimeMillis();
               
                System.out.println("\n");
                System.out.println(n+"中的质数个数为"+(n - n2 + 1));
                System.out.println("计算用时:" + (endTime - startTime) + "ms");
                System.out.println("需要输出这些质数吗? Y/N");
                String ok=cr.next();
               
                if(ok.equals("y")|ok.equals("Y"))
                {
                        for (int i = 0; i < n + 1; i++)
                        {
                                if (!num)
                                {
                                        System.out.print(i+" ");
                                }
                        }
                }
        }
}



31 个回复

正序浏览
可以可以
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
回复 使用道具 举报
加油,同学
回复 使用道具 举报
好好学习
回复 使用道具 举报
gzgd 高级黑马 2019-3-12 11:08:19
16#
回复 使用道具 举报
gzgd 高级黑马 2019-3-12 11:08:17
15#
回复 使用道具 举报
gzgd 高级黑马 2019-3-12 11:08:15
14#
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马