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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

小生在这里先谢谢各位黑马了!!!
这道题是面试代码题中的一道,我用循环嵌套和List集合做出来了,但是感觉用集合做很娄!
求教有没有更简单的方法!!!

  1. package com.itheima.test;

  2. import java.util.ArrayList;

  3. //:判断101-200之间有多少个素数,并输出所有素数。
  4. public class SuShuTest {
  5.         public static void main(String[] args) {
  6.                 ArrayList<Integer> al = new ArrayList<Integer>();
  7.                 for (int x = 101; x < 200; x++) {
  8.                         for (int y = 2; y < x; y++) {
  9.                                 if (x % y == 0) {
  10.                                         break;
  11.                                 } else {
  12.                                         if (!al.contains(x)) {
  13.                                                 al.add(x);
  14.                                         }
  15.                                 }
  16.                         }
  17.                 }
  18.                 System.out.println(al);
  19.         }
  20. }
复制代码



20 个回复

倒序浏览
本帖最后由 zmhlnrs 于 2014-12-10 22:21 编辑

for (int y = 2; y < x; y++) {
                                if (x % y == 0) {
                                        break;
回复 使用道具 举报
代码运行结果不正确。
以105为例。
当X=105时。
从y=2开始循环,105%2=1,不等于0,于是便将105加入到了集合中,这显示是错误的。
  1. public class Test2 {
  2.         public static void main(String[] args) {
  3.                 int count = 0;
  4.                 for(int i=101;i<=200;i++)
  5.                 {
  6.                         if(sushu(i))
  7.                         {
  8.                                 count++;
  9.                                 System.out.println(i);
  10.                         }
  11.                 }
  12.                 System.out.println("101-200间素数个数:"+count);
  13.         }
  14.         public static boolean sushu(int x)
  15.         {
  16.                 for(int i=2;i<x;i++)
  17.                 {
  18.                         if(x%i==0)
  19.                                 return false;
  20.                 }
  21.                 return true;
  22.         }
  23. }
复制代码

这是我的代码。

评分

参与人数 2技术分 +1 黑马币 +3 收起 理由
李家汉子初养成 + 1
wez924612 + 3 很给力!

查看全部评分

回复 使用道具 举报
收着备用。
回复 使用道具 举报
zmhlnrs 发表于 2014-12-10 22:00
for (int y = 2; y < x; y++) {
                                if (x % y == 0) {
                     ...

素数不是只能被1和自身整除的数么?
回复 使用道具 举报
class Demo
{
         public static void main(String[] args)
         {
    boolean flag = true;
                 for (int i=101;i<=200 ;i++ )
                 {
      flag = true;
      for (int j = 2;j<i ;j++)
      {
       if (i%j==0)
       {
        flag = false;
        break;
       }
      }
      if (flag)
      {
       System.out.println(i);
      }
      
                 }
         }
}

看我的  嘿嘿 我也来秀下

评分

参与人数 1黑马币 +3 收起 理由
wez924612 + 3 很给力!

查看全部评分

回复 使用道具 举报
Cfan_yang 发表于 2014-12-10 22:07
代码运行结果不正确。
以105为例。
当X=105时。

十分感谢啊! 原来我弄的是错的!给你几个币子。
回复 使用道具 举报
農邨尛夥兒 发表于 2014-12-10 22:23
class Demo
{
         public static void main(String[] args)

谢谢,谢谢!哈哈!
回复 使用道具 举报
wez924612 发表于 2014-12-10 22:35
谢谢,谢谢!哈哈!

客气客气  互相学习
回复 使用道具 举报
wtjohn 中级黑马 2014-12-10 22:52:54
10#
  1. for (int x = 101; x < 200; x++) {
  2.                         for (int y = 2; y < x; y++) {
  3.                                 if (x % y != 0) {
  4.                                         System.out.println(x);
  5.                                 }
  6.                         }
  7. }
复制代码
回复 使用道具 举报
cz萑 中级黑马 2014-12-10 23:17:26
11#
可以把代码换成这个 for(int y = 2; y < Math.sqrt(x); y++),意思是y从2到x的开平方根,你可以考虑一下
回复 使用道具 举报
class SuShu
{
        public static void main(String[] args)
        {
                int count=0;
                for (int x=101;x<201 ;x++ )
                {
                        for (int y=2;y<=x ;y++ )
                        {       
                                if(x%y==0&&y!=x)
                                {
                                        break;
                                }
                                else if(y==x)
                                {
                                System.out.println(x);
                                count++;
                                }

                        }
                }
                System.out.println("count="+count);
        }
}
新人,这样应该可以吧
回复 使用道具 举报
冥夜 中级黑马 2014-12-10 23:47:03
13#
本帖最后由 冥夜 于 2014-12-11 00:11 编辑

你这种算法能做出来但是得分不会高的,你相当于把每个数都除了他本身次,正确的做法是除以2和大于2的所有奇数,且除的数不大于本身开根号。如果想更高效,可以除以不大于其的所有素数。还有就是用筛法也可以做。。我这里给出代码,虽然代码会长点,但是效率会比你这直接除来的高。

  1. private static ArrayList<Integer> getSuShu(int min,int max)//常规的遍历除
  2.         {
  3.                 ArrayList<Integer> al=new ArrayList<Integer>();
  4.                
  5.                 boolean flag=true;//标志是否为素数
  6.                
  7.                 if(min<=2)
  8.                         al.add(2);
  9.                
  10.                 for(int i=(min%2==0?min+1:min);i<=max;i+=2)//素数除了2都不为偶数
  11.                 {
  12.                         flag=true;//初始化标识
  13.                         for(int j=3;j<=Math.sqrt(i);j++)//因为已经排除了偶数所以可以不除2
  14.                         {
  15.                                 if(i%j==0)//只要能被整除就不是素数,跳出循环
  16.                                 {
  17.                                         flag=false;
  18.                                         break;
  19.                                 }
  20.                         }
  21.                         if(flag)
  22.                                 al.add(i);//向集合添加素数
  23.                 }
  24.                
  25.                 return al;
  26.         }
  27.        
  28.         private static ArrayList<Integer> getSuShu2(int min,int max)//筛法
  29.         {
  30.                 ArrayList<Integer> al=new ArrayList<Integer>();//创建一个集合进行筛
  31.                 ArrayList<Integer> al2=new ArrayList<Integer>();//保存筛出的素数
  32.                
  33.                 for(int i=2;i<max+1;i++)//初始化集合
  34.                 {
  35.                         al.add(i);
  36.                 }
  37.                
  38.                 int a=0;//初始化除数
  39.                 while(al.size()>0)//如果第一个集合内还有值就继续筛
  40.                 {
  41.                         a=al.get(0);//获得第一个集合中最小的数,这个数一定是素数
  42.                         al2.add(a);//将这个素数加入集合2
  43.                         for(int i=0;i<al.size();i++)//删除集合中这个数的倍数
  44.                         {
  45.                                 if(al.get(i)%a==0)
  46.                                         al.remove(i);
  47.                         }
  48.                 }
  49.                
  50.                 for(int i=0;i<al2.size();i++)//遍历集合删除不符合范围的素数
  51.                 {
  52.                         if(al2.get(i)<min||al2.get(i)>max)
  53.                         {
  54.                                 al2.remove(i);
  55.                         }
  56.                 }
  57.                
  58.                 return al2;
  59.         }
复制代码


回复 使用道具 举报
你的面试题这么简单么,其实还可以用乘法的方法,算法大概是你这算法时间1%
回复 使用道具 举报
kane 中级黑马 2014-12-11 00:09:24
15#
哦,我也涨知识了
回复 使用道具 举报
  1. class SuShuTest
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                
  6.                 int x ,y,i=0;
  7.                 for(x=101;x<=200;x+=2)
  8.                 {
  9.                         boolean f = true;
  10.                         for(y=2;y<=Math.sqrt(x);y++)
  11.                         {
  12.                                 if(x%y==0)
  13.                                 {
  14.                                         f = false;
  15.                                         continue;
  16.                                 }
  17.                         }
  18.                         if(f)
  19.                         {
  20.                                 System.out.printf("%d\t",x);
  21.                                 i++;
  22.                                 if(i%5==0)
  23.                                 {
  24.                                         System.out.println();
  25.                                 }
  26.                         }
  27.                                
  28.                 }
  29.                 System.out.println("共有"+i+"个素数");
  30.         }
  31. }
复制代码


自赞一个。。。。
回复 使用道具 举报
交流交流

  1. *
  2. * 求100到200之间的素数个数,并输出
  3. */
  4. public class Test2 {

  5.         public static void main(String[] args) {
  6.                 // TODO Auto-generated method stub
  7.                 int count = 0;// 定义素数计数器
  8.                 for (int x = 100; x <= 200; x++) {
  9.                         boolean flag = true;// 定义标记flag,true表示是素数
  10.                         for (int y = 2; y < x; y++) {
  11.                                 if (x % 2 == 0 || x % y == 0) {// 偶数肯定不是素数
  12.                                         flag = false;// 不是素数,标记变为false,结束内循环
  13.                                         break;
  14.                                 }
  15.                         }
  16.                         // 内循环结束后标记没变false,说明x满足是素数的条件
  17.                         if (flag == true) {
  18.                                 System.out.print(x + " ");// 打印x,计数器自增
  19.                                 count++;
  20.                         }
  21.                 }
  22.                 System.out.println();
  23.                 System.out.print("素数的个数是:" + count);// 外循环结束,打印素数个数

  24.         }

  25. }
复制代码
回复 使用道具 举报
隔壁老王。。我觉得楼上的一些算法都麻烦爆了。。
回复 使用道具 举报
a986875894 发表于 2014-12-13 00:22
隔壁老王。。我觉得楼上的一些算法都麻烦爆了。。

:L0.0   低调!
回复 使用道具 举报
wez924612 发表于 2014-12-10 22:22
素数不是只能被1和自身整除的数么?

这句话是用来判断,当在2~x之间有可以整除的数时,说明不是素数的
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马