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

蒙牛小布丁

初级黑马

  • 黑马币:3

  • 帖子:5

  • 精华:0

© 蒙牛小布丁 初级黑马   /  2015-1-2 11:08  /  3045 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

5黑马币
设计一程序,要求用筛选法求100以内的素数,筛选法就是从2到100中去掉2,3,……9,10的倍数,剩下的就是100以内的素数,已知该程序的功能框架如下:
   main( )
{
   建立2到100的数组A[],其中A[i]=i;
   建立2到10的素数表B[],其中存放2到10以内的素数;
   若A[i]=i是B[]中任一数的倍数,则剔除A[i];
   输出A[]中所有没有被剔除的数



下面是我的实现代码
我看着感觉没错啊  但是输出结果是从2开始一直输出100
问题出在哪呀?
我是新手啊  现在还在看视频   求帮助啊
        class Array03
  {
   public static void main(String[]args)
   {
       int[] arr1 = new int[101];
           int[] arr2 = {2,3,5,7};
           for(int i=0;i<4;i++)
           {   
                 for(int j=2;j<=100;j++)//用数字0标记arr1[j]能被arr2[i]整除的元素实现方法
                   {
                       arr1[j]=j;
                       if(arr1[j]/arr2[i]*arr2[i]==arr1[j])
                      arr1[j]=0;
                   }
                  
          }
          for(int j =2;j<=100;j++)//遍历数组输出结果
                   {
                 if(arr1[j]!=0)
                         {
                         System.out.println(arr1[j]);
                         }
           }
   }
}



最佳答案

查看完整内容

先说明一下LZ的问题,然后再给出正确答案。 LZ最大的问题是:数组初始化位置不对。具体,看下面,我在你代码中添加的注释。 另外,LZ对一个数能否被整除,还可以写的更清晰依稀。 把下面的这个判断条件: 修改为为 正确解答如下:

7 个回复

倒序浏览
本帖最后由 lpf870826 于 2015-1-2 12:27 编辑

先说明一下LZ的问题,然后再给出正确答案。

LZ最大的问题是:数组初始化位置不对。具体,看下面,我在你代码中添加的注释。
  1. for(int j=2;j<=100;j++)//用数字0标记arr1[j]能被arr2[i]整除的元素实现方法
  2.                    {
  3.                        arr1[j]=j;  // 在这里初始化代码,会每次循环都初始化一遍,这样就把以前的计算结果给丢了。所以,数组初始化不能放到这里。
  4.                        if(arr1[j]/arr2[i]*arr2[i]==arr1[j])
  5.                       arr1[j]=0;
  6.                    }
复制代码


另外,LZ对一个数能否被整除,还可以写的更清晰依稀。
把下面的这个判断条件:
  1. if(arr1[j]/arr2[i]*arr2[i]==arr1[j])
复制代码
修改为为
  1. if(arr1[j] % arr2[i] == 0)
复制代码


正确解答如下:
  1. public class Main {
  2.     public static void main(String[] args) {
  3.         // 100以内,只需要计算2到100就行了。节省空间,也只需要长度为99的数组即可。
  4.         int[] prime = new int[99];
  5.         // 初始化数组。
  6.         for (int i = 0; i < prime.length; i++) {
  7.             prime[i] = i + 2;
  8.         }

  9.         // 可以将数组的初始化结果打印出来,看看是否正。
  10. //        System.out.println("\n--数组初始化结果如下:----------");
  11. //        for (int i = 0; i < prime.length; i++) {
  12. //            System.out.print(prime[i] + " ");
  13. //        }

  14.         int[] base = {2, 3, 5, 7};


  15.         for (int i = 0; i < base.length; i++) {
  16.             for (int j = 0; j < prime.length; j++) {
  17.                 // 注意:当元素为2、3、5、7时,和10以内的素数相等,则prime[j] % base[i] == 0,
  18.                 // 会把这些数排除在外,所以需要加一个判断。
  19.                 if (prime[j] % base[i] == 0 && prime[j] != base[i]) {
  20.                     prime[j] = 0;
  21.                 }
  22.             }
  23.         }

  24.         // 也可以这样写。
  25. //        for (int i = 0; i < prime.length; i++) {
  26. //            for (int j = 0; j < base.length; j++) {
  27. //                if (prime[i] % base[j] == 0 && prime[i] != base[j]) {
  28. //                    prime[i] = 0;
  29. //                }
  30. //            }
  31. //        }

  32.         // 将结果打印出来。
  33.         System.out.println("\n--下面是100以内的素数:----------");
  34.         for (int i = 0; i < prime.length; i++) {
  35.             if (prime[i] != 0) {
  36.                 System.out.print(prime[i] + " ");
  37.             }
  38.         }

  39.         System.out.println("\n\n--另外一种算法,和上面的做对比,来检验是否正确。-----------");
  40.         for (int i = 2; i < 101; i++) {
  41.             boolean isPrime = true;
  42.             for (int j = 2; j <= Math.sqrt(i); j++) {
  43.                 if (i % j == 0 && i != j) {
  44.                     isPrime = false;
  45.                     break;
  46.                 }
  47.             }
  48.             if (isPrime) {
  49.                 System.out.print(i + " ");
  50.             }
  51.         }
  52.     }
  53. }
复制代码
回复 使用道具 举报
:(来人哦
回复 使用道具 举报
本帖最后由 王德亮 于 2015-1-2 12:12 编辑

arr1[j]=j; 这一句 有问题,
     比如去掉是否整除2的时候 你 把 8去掉了 然后第二次判断是否是3的倍数的时候 这一句又把arr1[8] = 8 可以把初始化放到最前面 这样也比较算符合逻辑 毕竟初始化只要一次就好了
   还有一点 你的判断条件 当j = 2,3,5,7的时候也会成立 也会把值变成0  这也是一个问题
望采纳
回复 使用道具 举报
王德亮 发表于 2015-1-2 12:07
arr1[j]=j; 这一句 有问题,
     比如去掉是否整除2的时候 你 把 8去掉了 然后第二次判断是否是3的倍数的 ...

按你说的改了下程序   真的解决了!!!!:D
回复 使用道具 举报
王德亮 发表于 2015-1-2 12:07
arr1[j]=j; 这一句 有问题,
     比如去掉是否整除2的时候 你 把 8去掉了 然后第二次判断是否是3的倍数的 ...

可是   好像不知道怎么采纳。。。。。
回复 使用道具 举报
本帖最后由 bluebloodant 于 2015-1-2 12:39 编辑

。。。。。。。。。。。。。
回复 使用道具 举报
本帖最后由 王德亮 于 2015-1-2 12:55 编辑
蒙牛小布丁 发表于 2015-1-2 12:17
可是   好像不知道怎么采纳。。。。。

把 for (int j = 2; j <= 100; j++) {
          arr1[j] = j
    }
写到前面
然后把 if (arr1[j] / arr2 * arr2 == arr1[j]) 判断条件改为
if (arr1[j] % arr2 == 0 && arr1[j] != arr2)  // 第一个是判断是否是他的倍数 第二个是确定不是arr2中的元素,即{2,3,5,7}

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马