首页 > 其他分享 >找出100以内的所有素数(质数)?100000以内的呢?

找出100以内的所有素数(质数)?100000以内的呢?

时间:2024-07-07 19:31:27浏览次数:20  
标签:以内 质数 System isFlag 100000 println 100 out

一. 前言

        本文介绍多种方式来实现“找出100以内的所有素数(质数)?100000以内的呢?”的需求。各种方式之间存在巨大差异,请认真体会代码含义,理解编程思想对于计算机程序运行的优劣。从而理解算法对于程序的重要性。

二、需求分析

素数(质数):只能被1和它本身整除的自然数。(注意:1不是素数)

例如:2、3、5、7、11、13、17、19、23、...

三.算法实现

实现方式1:

class PrimeNumberTest {
    public static void main(String[] args) {

        long start = System.currentTimeMillis(); //记录当前时间距离1970-1-1 00:00:00的毫秒数    
        int count = 0;//记录质数的个数


        for(int i = 2;i <= 100000;i++){  //
            boolean isFlag = true; //用于标识i是否被除尽过
        
            for(int j = 2;j <= i - 1;j++){
                if(i % j == 0){ //表明i有约数
                    isFlag = false;
                }
            }

            //判断i是否是质数
            if(isFlag){ //如果isFlag变量没有给修改过值,就意味着i没有被j除尽过。则i是一个质数
                //System.out.println(i);
                count++;
            }

            //重置isFlag,思考为什么要将isFlag重置?
            //isFlag = true;
        
        }

        long end = System.currentTimeMillis();
        System.out.println("质数的个数为:" + count);
        System.out.println("执行此程序花费的毫秒数为:" + (end - start)); //16628

    }
}

实现方式2:针对实现方式1进行优化

class PrimeNumberTest1 {
    public static void main(String[] args) {
        
        long start = System.currentTimeMillis(); //记录当前时间距离1970-1-1 00:00:00的毫秒数

        int count = 0;//记录质数的个数

        for(int i = 2;i <= 100000;i++){  //i

            boolean isFlag = true; //用于标识i是否被除尽过
        
            for(int j = 2;j <= Math.sqrt(i);j++){ //优化2:将循环条件中的i改为Math.sqrt(i)
                
                if(i % j == 0){ //表明i有约数
                    isFlag = false;
                    break;//优化1:主要针对非质数起作用
                }
            
            }

            //判断i是否是质数
            if(isFlag){ //如果isFlag变量没有给修改过值,就意味着i没有被j除尽过。则i是一个质数
                //System.out.println(i);
                count++;
            }
        
        }

        long end = System.currentTimeMillis();
        System.out.println("质数的个数为:" + count);
        System.out.println("执行此程序花费的毫秒数为:" + (end - start));//1062

    }
}

 解释:

优化1:表示如果查到计算到当前值并非质数,就不再进行下面的计算。比如:对15进行计算的时候,内层循环计算15%3==0,从而将flag设置为flase,那么如果没有break就会继续计算15%4。

优化2:思考这样一个问题“假设现在要找出100以内的质数,按照方式一的逻辑是怎样的?”。首先我们会从2开始直到100,也就是[2,100]。那么看接下来的式子:2*50=100,3*33.3 = 100,4*25=100,5*20=100,6*16.66=100。你发现了吗,如果对于当前判断数100来讲,随着被除数逐渐增大,除数逐渐减小。那么如果使用数字2判断出来100不是质数,那么使用50也能判断出100不是质数。这么说你或许就明白了。那么我们只需要判断到那个数值才算可以呢?那就是被除数和除数相等,即“被除数*除数=当前判断值,被除数=除数”,即“当前判断值开平方”。

实现方式3:使用continue + 标签

class PrimeNumberTest2 {
    public static void main(String[] args) {
        
        long start = System.currentTimeMillis(); //记录当前时间距离1970-1-1 00:00:00的毫秒数

        int count = 0;//记录质数的个数

        label:for(int i = 2;i <= 100000;i++){  //i
        
            for(int j = 2;j <= Math.sqrt(i);j++){ //优化2:将循环条件中的i改为Math.sqrt(i)
                
                if(i % j == 0){ //表明i有约数
                    continue label;
                }
            
            }
            //一旦程序能执行到此位置,说明i就是一个质数
            System.out.println(i);
            count++;
        }
        

        long end = System.currentTimeMillis();
        System.out.println("质数的个数为:" + count);
        System.out.println("执行此程序花费的毫秒数为:" + (end - start));//1062

    }
}

思考一下这种方式优化在哪了?这么优化的好处是什么?

标签:以内,质数,System,isFlag,100000,println,100,out
From: https://blog.csdn.net/weixin_44554794/article/details/140246381

相关文章

  • 打印100以内所有能被3整除的数,每5个数打印一行(devC++)
     今天让我们来学习如何利用C语言,在运行框中打印100以内所有能被3整除的数,每五个数打印一行。 首先,我们需要定义两个变量,其中n表示1~100的数字,m表示3的倍数的个数。然后利用一个for循环,在循环中n自增,利用一个if判断语句判断是否为3的倍数,如果是,则输出在循环中再利用一个......
  • C语言 找出 1000 以内的所有完数
    一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6的因子为1,2,3,而6=1+2+3,因此6是“完数”,编程序找出1000以内的所有完数,并按下面格式输出其因子:6itsfactorsare1,2,3这个程序找出1000以内的所有完数,并输出每个完数及其因子。(如果因子和等于该数,则该数为完数。)#i......
  • [SNCPC2024] 2024 年陕西省大学生程序设计 J题猜质数II 题解
    题目链接:CF或者洛谷PS:CF的得等上gym。前提说明其实在上个月就见到这题了,当时很想做这题,结果找不到做题链接,也不知道出处,原来是陕西省赛的捧杯题。个人评价觉得是一道很不错的题,难度适中。讲解其实题解写的挺不错的,比很多比赛的题解写的详细许多了。这里站在我的角度分......
  • 手把手教你如何用python写一个经典小游戏(仅需100行以内的代码)
    创作灵感小时候也就是大概十几年前的时候,智能触屏手机还未大量普及,移动网络还是2G,大部分人用的都是小灵通,里面只有几款经典的游戏,比如俄罗斯方块,贪吃蛇等。还记得以前自己玩的不亦乐乎。如今网络发展迅速,通讯设备越来越智能化,集成化,这些上世纪的经典游戏似乎早已淡忘人们的视......
  • 洛谷 P5723 【深基4.例13】质数口袋 题解
    题面传送门观察题目,我们可以看到这是一道朴素的,判断质数的一道题目。何为质数?质数就是除了111和这个本身,没有其他因数的数。特别的,......
  • 【力扣 - 每日一题】3115. 质数的最大距离(一次遍历、头尾遍历、空间换时间、埃式筛、
    原题链接题目描述给你一个整数数组nums。返回两个(不一定不同的)质数在nums中下标的最大距离。示例1:输入:nums=[4,2,9,5,3]输出:3解释:nums[1]、nums[3]和nums[4]是质数。因此答案是|4-1|=3。示例2:输入:nums=[4,8,2,8]输出:0解释:nums[2]是质......
  • (nice!!!)LeetCode 3164. 优质数对的总数 II(数组、哈希表)
    3164.优质数对的总数II思路:先找出可以被k整除的nums[i].方法一:统计因子。1、找出数组nums1每个元素的因子,用哈希表来记录每个因子出现的次数。然后再遍历数组nums2进行累加即可。classSolution{public:constintN=1e6+10;longlongnumberOfPairs(vec......
  • 洛谷P1304 哥德巴赫猜想 (质数题) (内含埃氏筛和欧拉筛等一些小总结解释)
    题目题目解析题目意思很简单,对于每一组数据来说,就是找这个偶数的两个质数相加的那两个质数,并且要满足加法中的第一个质数要是最小的质数,满足第一个质数是最小的质数的情况下也要保证第二个数也是质数代码#include<bits/stdc++.h>usingnamespacestd;boolis_prime(in......
  • Miller Rabin算法判定质数(OI向)
    前言:本篇不太适合那些对数学证明要求严格的Oier,然后本人也是蒟蒻,主要写给自己回顾用的MillerRabin算法能快速的判断一个数是否为质数,作为一个数学算法它具有一定的玄学成分,但是在OI中通过一些手段可以使其达到100%正确。先让我们对比一下一般算法书教的2种关于质......
  • 利用MPI并行计算任意范围内的质数
    #include<stdio.h>#include<mpi.h>#include<malloc.h>#include<math.h>#include<string.h>booljud(inta){ intk=0; if(a<=1) returnfalse; for(inti=2;i<pow(a,0.5)+1;i++){ k=a%i; if(k==......