1003 数素数(20)-JAVA

题目描述
令Pi表示第i个素数。现任给两个正整数M <= N <= 10000,请输出PM到PN的所有素数。

输入描述:
输入在一行中给出M和N,其间以空格分隔。

输出描述:
输出从PM到PN的所有素数,每10个数字占1行,其间以空格分隔,但行末不得有多余空格。

输入例子:
5 27

输出例子:
11 13 17 19 23 29 31 37 41 43

47 53 59 61 67 71 73 79 83 89

97 101 103



思路和知识点:

  • 素数:在大于1的整数中,只能被1和这个数本身整除的数,如2、3、5、7、11。也叫质数。(1不是素数)
  • Math.sqrt(): JAVA中实现求一个数的平方根
  • 如何判断一个数是否是素数?
import java.util.Scanner;
 
public class Main {
    public static void main(String[] args) {
        Scanner sann = new Scanner(System.in);
        int left = sann.nextInt();
        int right = sann.nextInt();
        int times = 0;//用来计数
        for(int i=1; ;i++){ //从1开始判断每个数是否是素数
      
            if(isPrime(i)==true){
                times++;//如果是素数,计数加一
                if(times<right && times>=left){ //如果在要求的范围内,则要十个一行输出
                    if((times-left+1)%10 == 0 ){
                        System.out.print(i);
                        System.out.print("\n");//输出该数并换行
                    }else{
                        System.out.printf("%d ",i);//输出该数并空格
                    }
                }
                if(times == right){
                        System.out.printf("%d",i);
                        break; //跳出for循环
                }
            }//end if
        }//end for;
    }
     
// //     判断一个数是否是素数的方法
  public static boolean isPrime(int num){ 
    boolean flag = true; 
    if(num==1){ 
        flag = false;
    }
   if((num == 2 || num ==3)&& num!=1){
        flag = true;
    }else{ 
      for(int i=2;i<=Math.sqrt(num);i++ ){ 
        if(num%i==0){ 
          flag = false; 
          break; 
        } 
      } 
    } 
    return flag; 
  }     
}

哈哈哈哈哈哈,这道题实在折磨了我太长时间,网上找不到能编译成功的算法,自己小白一个,从判断素数的方法一句一句写起来,中间各种报错,还是使用java不熟练,很多语句都不太会写,连数组的初始化都要百度ORZ··· 好在,经过艰苦卓绝的顽强挣扎,终于把这道题解决了,相信以后写算法的能力也能有所提升,毕竟这是严格意义上自己第一道独立解决的算法题。
在此感谢LeetCode平台,提供了算法在线编译调试的平台,让我能一步步的尝试运行,从而找到自己原始版本中的错误。
总结一下,这道题做不出来的主要错误在于逻辑错误,好几个地方都是我的if语句的逻辑没有弄明白,几个if语句之间相互并列反而没有了需要的效果。
再次,向挣扎在算法路上的自己致敬!要继续勇敢的不放弃的走下去!

开心.png


补充(以下仅是思路,没有成功实现,可以不看,特此提醒):

在挣扎这道题的过程中,有看到关于素数判断的一些相关理论,包括孪生素数,还有“素数都在六的倍数两侧,但六的倍数两侧不一定都是素数。”作为一个严谨又充满好奇心的喵呜,我尝试了一下以六为倍数增加的方法,第一次写出来后在35这个数字这里卡住了,因为35的开平方是5,而我的for循环从7开始,所以35这个数字没有进入for循环进行判断,调整后将判断素数函数写作如下:

// //     判断一个数是否是素数的方法
  public static boolean isPrime(int num){  
     boolean flag = true;  
    if(num==1){  
        flag =false;
    }
   if((num == 2 || num ==3)&& num!=1){
        flag =true;
    }else{  
        if(num%6 != 1 && num%6!=5){
            flag = false;
        } else{
            if(num<49){  //小于7的平方的话,就不开平了
                for(int i = 7;i<num-5;i+=6){
                    if(num%i == 0){
                         flag = false;
                        break;
                    }  
                }
            }else{
                    for(int i = 7;i<=Math.sqrt(num);i+=6){
                    if(num%i == 0){
                         flag = false;
                        break;
                    }  
                }
            }//end else
        }//end else
        }//end else
        
    return flag;
  }// end isPrime

在调试运行后,又发现25不是素数,但是根据我们的算法得到的是素数,跟着逻辑走一边,发现上述算法的确得到25时是true,说明上述算法有误。

想了一下,素数分布在6的倍数的两侧,不是在左侧就是在右侧,也有可能左右两侧都是素数(6的倍数的左右两侧都是素数时,我们将这两个素数称作孪生素数),在我们上述算法中,根据上述思想进行了以6为步数的跃进,但是从7开始+6的跃进只遍历了6的倍数的右侧,而忽略了6的左侧,而并不是每一个6的倍数的右侧数字是素数的时候,左侧也一定是素数(反之亦然)。所以这种算法在4*6=24的左侧23(是素数)、右侧25(不是素数)时,出现了判断错误。

如何解决上述错误?那就只能左右两侧都进行判断,可是这样一来,算法是不是更加复杂?还不如原始算法??

走到这一步已经耗尽我的脑细胞了,所以戛然止步。如果有过路的读者有想法或者更好的意见,欢迎留言批评指正!

溜了溜了~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容