题目的意思:设有N个人围坐一圈并按顺时针方向从1到N编号,从第S个人开始进行1到M报数,报数到第M的人出圈,再从他的下一个人重新开始从1到M报数,如此进行下去,每次报数到M的人就出圈,知道所有人都出圈为止。给出这N个人的出圈顺序。
代码如下:
public class Count5Quit1 {
public static void main(String[] args) {
final int N = 13;         //总人数N
final int S = 3;          //从第S个人开始报数
final int M = 5;          //报数到M的人出圈
int[] p = new int[N];
int i,w,s,j;
for(i=1; i<=N; i++)
p[i-1] = i;            //对每个人进行编号
s = S;
for(i=N; i>=1; i--){       //总人数为N,一次减1
s = (s + M - 1) % i;   //计算下一个开始报数人的位置
if(s == 0)
s = i;             //最后一个人出圈的位置存入变量s中
w = p[s - 1];          //讲出圈人的编号保存到变量w中
for(j=s; j<=i-1; j++)  //从s位置开始,数组的内容依次前移
p[j-1] = p[j];
p[j-1] = w;            //讲w存入到空的位置中
}
System.out.print("出圈人的顺序为:");
for(i=p.length-1; i>=0; i--)
    System.out.print(p[i]+"  ");
}
}
以上:在p[j-1] = w行中,小弟看不懂,j这个变量没有进行初始化,为什么还能进行j-1操作。在调试的时候,将j-1换成i-1,输出结果和j-1的结果一致。
疑问:p[j-1] = w 和 p[i-1] = w有什么区别,困扰了好久依然不懂,希望各位高人能给小弟指点迷津。谢谢

解决方案 »

  1.   

    public class Count5Quit1 {
        public static void main(String[] args) {
        final int N = 13;         //总人数N
        final int S = 3;          //从第S个人开始报数
         final int M = 5;          //报数到M的人出圈
         int[] p = new int[N];
        int i,w,s,j;
        for(i=1; i<=N; i++)
            p[i-1] = i;            //对每个人进行编号
         s = S;
        for(i=N; i>=1; i--){       //总人数为N,一次减1
            s = (s + M - 1) % i;   //计算下一个开始报数人的位置
             if(s == 0)
            s = i;             //最后一个人出圈的位置存入变量s中
             w = p[s - 1];          //讲出圈人的编号保存到变量w中
             for(j=s; j<=i-1; j++)  //从s位置开始,数组的内容依次前移
                 p[j-1] = p[j];
            p[j-1] = w;            //讲w存入到空的位置中
           }
          System.out.print("出圈人的顺序为:");
          for(i=p.length-1; i>=0; i--)
              System.out.print(p[i]+"  ");
        }
    }
      

  2.   


    第一个问题
    j这个变量初始化了,在这行
             for(j=s; j<=i-1; j++)  //从s位置开始,数组的内容依次前移
    j初始化为s;第二个问题:
    for (j = s; j <= i - 1; j++) // 
      p[j - 1] = p[j];// 这里注意 for 的条件 j<=i-1;
    // 这意味着for循环执行的结果,j 等于 i;p[j - 1] = w; 
    所以你的观察不错,p[j-1] = w 和 p[i-1] = w没有区别
      

  3.   

    Quote: 引用 2 楼 jswatcher 的回复:

    引用 楼主 luofabo1987 的回复:……
    jswatcher:
    谢谢你的指点,小弟还有点儿疑问:
    // 这意味着for循环执行的结果,j 等于 i;
    for (j = s; j <= i - 1; j++) 这句语句是不是说当j=13跳出循环的时候,j=13的值依然保留?
    同时对J进行了初始化?
      

  4.   


    for (j = s; j <= i - 1; j++) 这句语句是说:
    1, 对j进行了初始化,赋值为 s;
    2, j <=i-1 不成立时跳出,这时 j的值必然是 i; 
      因为 j 定义在 for 循环之外,j的值依然保留