用素数三种方法,去理解内存处理,并达到节约资源的目的

实验环境与工具

编译器:IDEA

编程语言:java

环境:Windows11

 前言:

在计算机编程中,我认为节约计算机算力和资源是很重要的。用很小的算力和资源占用会使得计算机工作效率大幅提高。也会提高工作者的工作效率。而对于初学者来说如何去理解代码在内存的处理,就显得尤为重要。对于此,编程所用的几乎是同一个逻辑,所以对于编程语言是否为java并不重要。我这里只是用了经典语言而已。这个逻辑去理解C语言和最近大火的Python,以及其他语言都是可以的。

题目:

判定一个数字是否是素数(相信对于这个题目大家并不陌生,甚至大家在写这个题目时用不了3分钟,甚至有不同的解法)
方法一:
   //素数2-15
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n= scanner.nextInt();
        int i=2;
        for ( ;i< n;i++){
            if(n%i==0){
                break;
            }
        }
        if(i==n){
            System.out.println(n+"是素数");
        }
        else {
            System.out.println(n+"不是素数");
        }
    }

这里我所用的逻辑很简单。什么是素数,质数又称素数。一个大于1的自然数,除了1和它自身外,不能被其他自然数整除的数叫做质数;否则称为合数。这个解法是大多数人的解法。我们来理一下这个逻辑。

1.

首先我们列一个表

234567891011

2.

我这里用了一个for循环。条件是当我们输入的数%一个不断增加的数所得结果是否为0来判断。我们思考一下,什么情况的结果为0。

素数:我们以7为例。它%上一个数为0 的话。这个数是不是它的本身的,也就是7。%是取余。所以结果必定为0。

合数:我们以8为例。它%上一个数为0的话。这个数有2,4,8对不对。同样%是取余。这些数的结果也必定是0。

3.

小总结:

我们这里利用了素数取余为0的话,这个数必定为素数本身。

结果:
234567891011

 这个红色数字便是这次我们for循环,遍历的所有数字。

方法二:

   public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        int n= scanner.nextInt();
        int i=2;
        for ( ;i<= n/2;i++){
            if(n%i==0){
                break;
            }
        }
        if(i<=n/2){
            System.out.println(n+"是素数");
        }
        else {
            System.out.println(n+"不是素数");
        }
    }
这里我所用的逻辑是,首先素数也是一个数。任何一个数都是可以有两个数的乘积得到。比如7=7*1,8=2*4或1*8。也就是a*b。这个解法是部分人的解法。我们来理一下这个逻辑。
1.
首先我们还是创立一个表格
234567891011

2.

我这里用了一个for循环。条件是当我们输入的数%一个不断增加的数所得结果是否为0来判断,但这里做出与方法一 i 的最大数字不同的限制。我们思考一下,什么情况的结果为0。

素数:同样的,我们以7为例。7/2得3,/ 取整。然后程序就得出了7为素数的结论。这里我们看肯定会比较糊涂。先别急,让我们来看合数。

合数:同样的,我们以8为例,8/2=4,/ 取整,我们就发现,2-4中间什么数被8%后取0,这个数为2对不对?那么接下来这处循环就截止了。然后就程序结果就不是素数。

3.

小总结:

我们利用了在一组连续的自然数中,都是由合数和素数组成。而合数的二分之一前的所有数中,必定有一个为这个合数的因数。

234567891011

这里4之前的数中2为8的因数,所以提前终结。这样我们就排除合数的存在,数组中就只有素数

结果:

234567891011

这个红色数字便是这次我们for循环,遍历的所有数字。

方法三:

 public static void main(String[] args) {
 
        Scanner scanner=new Scanner(System.in);
        int n= scanner.nextInt();
        int i=2;
        for ( ;i<=Math.sqrt(n);i++){
            if(n%i==0){
                break;
            }
        }
        if(i<=Math.sqrt(n)){
            System.out.println(n+"是素数");
        }
        else {
            System.out.println(n+"不是素数");
        }
    }

这里我所用的逻辑是,首先素数也是一个数。任何一个数都是可以有两个数的乘积得到。比如7=7*1,8=2*4或1*8。也就是a*b,但是无论a还是b这个数都小于二倍根号下的这个数。这个解法是小部分人的解法。我们来理一下这个逻辑。

1.
首先我们还是创立一个表格
234567891011

2.

我这里用了一个for循环。条件是当我们输入的数%一个不断增加的数所得结果是否为0来判断,但这里做出与方法一 i 的最大数字不同的限制。我们思考一下,什么情况的结果为0。

素数:同样的,我们以7为例。7的二倍根号得2.6,取整的话为2。然后程序就得出了7为素数的结论。先别急,让我们来看合数。

合数:同样的,我们以8为例,8的二倍根号得2.8,取整的话为2,我们就发现,2被8%后取0,这个数为2对不对?那么接下来这处循环就截止了。然后就程序结果就不是素数.

3.

小总结:

我们利用了在一组连续的自然数中,都是由合数和素数组成。而合数的二倍根号所得结果必定有一个数是这个合数的因数,这样我们就排除合数的存在,数组中就只有素数。

结果:

234567891011

这个红色数字便是这次我们for循环,遍历的所有数字。

结论:

对比一下我们三个方法的结果:

方法一234567891011
方法二234567891011
方法三234567891011

对比这几个方法的结果我们可以很清晰的看到,对于同一个题目不同算法,遍历的数字有不同的结果。方法三的遍历的最少。相应的我们也就知道他的速度很快,比方法一和二都快。

诺我们将整个数组看成一个中央处理器(cpu)的处理数据列表,并且一个格子就代表一个计算节点的话。我们可以很清楚的看出,方法三可以最快计算出来,将计算节点空出来后,用于其他计算。 所以同等情况下,第三种方式最节省资源,用时也最少。

我想说的话:

初学者不必觉得,这些方法我怎么想不到,从而放弃编程。对于我们而言,最重要的是将结果算对。而如何做的更好,是要我们不停去学习,不断去了解这些方法。不断去看别人的思路,或许会给自己不同的体验和想法。

我们一起学习,成长。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值