public class OutThree{
public static void main(String[] args){
int [] a=new int[500];
for(int i=0;i<500;i++){
a[i]=1;
}
int count=0;
int max=0;
int i=0;
while(max<a.length-1){
if(a[i]==1){
count++;

if(count%3==0){
a[i]=0;
max++;
count=0;
}
}
i++;
if(i==a.length){
i=0;
}
}
for(i=0;i<a.length;i++){
if(a[i]==1){
System.out.println(i);
break;
}
}
}
}
以上是小弟练习时候打的一段代码。现在是正确的。
但开始得时候小弟打到while语句时候是这样写的:
while(max<a.length-1){
if(a[i]==1){
count++;
} //这个括号是我本来写得位置,下面注释掉得括号是正确时候的位置
if(count%3==0){
a[i]=0;
max++;
count=0;
}
//}
i++;
if(i==a.length){
i=0;
}
}
本来就是一个隔3去值得一个运算,想不明白这个括号位置有这么大影响。不是都是2个if判断而已吗?

解决方案 »

  1.   

    第二种写法会导致死循环,max <a.length-1这个条件永远成立,要在循环中改变max的值。
      

  2.   

    明显不一样么
    while(max <a.length-1){ 
    if(a[i]==1){ 
    count++; 
    } //这个括号是我本来写得位置,下面注释掉得括号是正确时候的位置 
    if(count%3==0){ 
    a[i]=0; 
    max++; 
    count=0; 

    //} 
    i++; 
    if(i==a.length){ 
    i=0; 

    } 你写的那个括号使这2个if判断独立了  而正确的意思是说 要满足了前面这个IF再去判断是否满足下面一个IF
      

  3.   

    兄弟,这个我也看出来了,但是从整个程序而言,先判断第一个if 再判断第二个if有什么区别啊。如果第一个if不成立 count 就永远不变,如果count永远不变,第二个if也永远不会成立的啊。
      

  4.   

    我没仔细看LZ实现的代码具体是什么功能,但你说的这两种情况明显不一样,第一个if不成立,如果按照你正确的写法,不仅仅是count不变,而且第二个if也不可能会执行,可是你换成错误的写法后变成什么了?就算第一个if不成立,count不变,谁说这个时候第二个if一定也不执行的?正确的写法第一个if是否成立会影响第二个if的是否能执行的可能性,可是分开写第一个if成不成立和第二个if能不能执行没啥关系啊,这怎么能一样呢?
      

  5.   

    package com.alpha.test;public class OutThree
    {
    public static void main(String[] args)
    {
    int[] a = new int[500];
    for (int i = 0; i < 500; i++)
    {
    a[i] = 1;// 数组的内容都是 1
    }
    int count = 0;
    int max = 0;
    int i = 0;
    /**
     * while (max < 499)//a.length 可以直接写500 因为你开始设置了。 {
     * System.out.println(max); if (a[i] == 1)//永远为真 { count++;
     * System.out.println("true"); if (count % 3 == 0) { a[i] =
     * 0;//修改数组内容在count%3==0 max++; count = 0; } } i++; if (i == 500) { i =
     * 0; } }
     */ while (max < a.length - 1)
    {
    if (a[i] == 1)
    {
    count++;
    } // 这个括号是我本来写得位置,下面注释掉得括号是正确时候的位置
    if (count % 3 == 0)
    {
    a[i] = 0;
    max++;
    count = 0;
    }
    // }
    i++;
    if (i == a.length)
    {
    i = 0;
    }
    } for (i = 0; i < 500; i++)
    {
    if (a[i] == 1)
    {
    System.out.println(i);
    break;
    }
    }
    }
    }运行结果是:1
      

  6.   

    package com.alpha.test;public class OutThree
    {
    public static void main(String[] args)
    {
    int[] a = new int[500];
    for (int i = 0; i < 500; i++)
    {
    a[i] = 1;// 数组的内容都是 1
    }
    int count = 0;
    int max = 0;
    int i = 0; // while (max < 499)// a.length 可以直接写500 因为你开始设置了。
    // {
    // System.out.println(max);
    // if (a[i] == 1)// 永远为真
    // {
    // count++;
    // System.out.println("true");
    // if (count % 3 == 0)
    // {
    // a[i] = 0;// 修改数组内容在
    // max++;
    // count = 0;
    // }
    // }
    // i++;
    // if (i == 500)
    // {
    // i = 0;
    // }
    // } while (max < a.length - 1)
    {//1
    if (a[i] == 1)
    {
    count++;
    } // 这个括号是我本来写得位置,下面注释掉得括号是正确时候的位置
    //你写在这里 就是 while的1位置对应介绍了。和位置2的是并列的判断条件,如果注释后,2位置的判断就是嵌套的
    if (count % 3 == 0)//2
    {
    a[i] = 0;
    max++;
    }
    count = 0;
    }
    // }
    i++;
    if (i == a.length)
    {
    i = 0;
    } for (i = 0; i < 500; i++)
    {
    if (a[i] == 1)
    {
    System.out.println(i);
    break;
    }
    }
    }
    }
      

  7.   

    JavaAlpha兄。你得说法很正确,我也认真思考了一下 嵌套和不嵌套的运行过程。
    这个程序基本思路是一个有500个元素得array,所有元素得值都是1
    当我数到第3个元素就将其值该为0。 于此同时我还定义了只有读取元素值为1得时候才会算是读取了一个元素。也就是隔3去除一个元素。
    现在没嵌套得环境下,我先判断是否fi(a[i]=1){count++};也就是判断是否算是读取了一个元素。
    然后才是下一个判断if(count%3==0),如果是得话那么这个a[i]就必定值是1,所以该为0;而在嵌套得环境下就是直接判断它是不是一个值为1得元素。如果不是的话 就直接跳出去,连if(count%3==0)也可以直接略过去了。这2个方法的确是有区别得。但是认真想下,非嵌套环境下如果fi(a[i]=1){count++};不成立,那么count 得值是不会改变得 if (count % 3 == 0)
               // {
                   // a[i] = 0;// 修改数组内容在
                     // max++;
                   // count = 0;
                   // }
    count的值也不会变化,那么count%3如何能等于0;写到这里我发现你帮我该了下 把count写在这个if语句得外面。 但是你看 每次while执行得时候都要把count 归0,这个有什么意义?初衷都改变了啊
      

  8.   

    没事,我自己也有点晕了。哎 这个东西 。。刚才我在百度知道那边看到一个人说 把if(count%3==0)该成if(count==3)是一样的。
    我开始觉的他没回答到重点。
    但是我一试验吃惊了。
    用我本来错误得非嵌套格式 就该成count==3  结果居然正确了。 我很疑惑
      

  9.   

    if(count%3==0)该成if(count==3) 应该是后者的count==3的效率高吧 我是这么想的 呵呵 
      

  10.   

    百度那边兄弟帮我解决了。
    if(count%3==3)这个地方就是错得关键
    0%3==0;
    1%3==1;
    2%3==2;
    3%3==0;因为还有一个count==0的时候存在
    所以当count==0||count==3得时候都会执行下面那个if语句;
    所以当if(count%3==3)的时候一定要用嵌套避免count==0的时候还运行下面一个if语句。
      

  11.   

    是我太主观了还是您老人家没看懂我的意思?当
    if(i==a.length){ 
       i=0;
    }产生效果,再进入while循环,两个if是嵌套,还是并列,还能一样吗?当
    if(i==a.length){ 
       i=0;
    }没产生效果时,也就是没执行时,当然如您老人家所说,是否嵌套并不影响结果,可是当max还没加到a.length-1时,i已经==a.length了,i清0,再从a数组第0个元素循环,这时这个a数组里还全是1吗?
    if(a[i]=1)还能是永远为true吗?这时嵌套判断与并列判断还能一样吗?