竹笋

首页 » 问答 » 灌水 » 对于判断一个正整数是否为质数的深入与思考
TUhjnbcbe - 2022/10/16 19:20:00
北京治皮肤病的医院 http://pf.39.net/bdfyy/bdfzd/220417/10630051.html

需求

今天在学习的过程中,遇到一个这样的一个题目,需求是这样的:

从控制台接收一个正整数,判断该质数是否为质数?

质数的概念:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。

那什么是因数呢?就比如6=2*3,6=1*6,那么6的因数是1、2、3、6,除了1和6之外,还有2和3两个因数,所以6不是质数,而5只有1和5本身两个因数,所以5是因数。

那么该如何用Java代码实现呢?

Java代码

初步思考:从键盘获取数据后,先判断接收到的数据是否为正整数,然后进行for循环结合if和elseif语句进行判断。

判断思路是这样的,使用变量num统计次数,如果num等于1,说明该数就是1,不是质数,也不是合数,如果num等于2,说明只有1和其自身两个因数,则n就是质数,除此之外,是合数。

代码如下:

Java代码

文字代码如下:

publicclassTest04{//定义一个Test04类publicstaticvoidmain(String[]args){java.util.Scannerscan=newjava.util.Scanner(System.in);//接收数据intn=scan.nextInt();判断输入的n是否为正整数if(n=0){System.out.println(输入的数字有误);}else{//n为正整数intnum=0;//num统计次数,初始化为0for(inti=1;i=n;i++){if(n%i==0){//判断条件,取余为零num++;//统计次数}}if(num==1){//次数为1,说明在for循环中只运行一次,即n为1,不是质数也不是合数;System.out.println(n+既不是质数,也不是合数);}elseif(num==2){//说明在for循环中,n只有1和其自身两个因数System.out.println(n+是质数);}else{//num次数大于2,说明除了1和自身之外,还有其他因数System.out.println(n+是合数);}}}

在我编写完毕后,代码运行结果正确,但是我又在思考,该代码的运行是复杂,时间复杂度是不是过大,其运行次数过多,该代码能不能进行优化呢?

代码优化

在老师的提醒下,可以使用break语句以及三目运算符来进行对代码进行编写,最终发现其代码更简洁。

publicclassTest05{publicstaticvoidmain(String[]args){    //从控制台接收一个正整数。    java.util.Scanners=newjava.util.Scanner(System.in);intnum=s.nextInt();    //考虑在外边准备一个布尔类型的标记。    booleanzhiShu=true;//true表示是质数。    for(inti=2;inum;i++){      if(num%i==0){/**假设输入的是7:7/1不用判断7/2需要判断7/3需要判断7/4需要判断(假设这个判断,发现可以整除,就没必要往下判断了。)7/5需要判断7/6需要判断7/7不用判断*///循环没必要执行了,为了效率,这里要终止循环        zhiShu=false;        break;      }    }    System.out.println(num+(zhiShu?是:不是)+质数);  }

结论

对于质数的判断,我想,应该还有很多方法,或许还有很多更加简便的方法来判断,从中获得最大的感触就是,要学会举一反三,针对不同的需求,学会分析和思考,在初步完成代码后,要思考,有没有更好的改进来优化,使其代码更少,效率更高。

所以,培养编程思维真的挺重要!

半路出家的程序员,目前还在自学,更多理解还不是很到位,希望大佬多给出一些中肯的建议以及方法。

1
查看完整版本: 对于判断一个正整数是否为质数的深入与思考