/**
题目:一个有n人的队列站成一排,依次报数,报3的人出列,下一位继续从1开始报数,报3的出去……
报完后再从头接着报,直到最后剩一个人,编程找出最后一个人原来排第几位。
*/
class  Example_1
{
public static int find(int n)//n为队列的总人数
{
int []sequence = new int[n];//定义一个数组用来存放队列中人物所对应的编号
for(int q = 1; q <= n; q++)
{
sequence[q - 1] = q;//为队列中的每一个人按位置编号
} int j = 2;//用j来记录每一轮出列的第一个人所在数组元素的下标
int i = j;
while(n > 1)//一直循环到最后一个人
{
for(i = j; i < n; i += 2)
{//这里步长设为2而不设为3是因为每次删除一个元素后数组整体前移一位,原来的下一位成了现在的当前位
for(int k = i; k < n - 1; k++)
{
sequence[i] = sequence[i + 1];//删除下标为i的数组元素
}
n -= 1;//删除后数组长度减1
}
j = i - n;//计算下一轮第一个要删除的人所在数组元素的下标
} return sequence[0];//返回最后一个人原来的位置
}

public static void main(String[] args) 
{
System.out.println(find(12));
}
}//未调试成功,与预期值不符(8以及大于10的值不相同)为什么数字较小时正常,稍大一点就不行了呢?

解决方案 »

  1.   

    楼主确定数字小时也正常吗,在我看来不可能正常.楼主应该是眼花了把,把sequence[i] = sequence[i + 1]换成sequence[k] = sequence[k + 1]试试。
    要不是眼花你可以想想,要是i,那么第二个for循环就毫无意义了,循环(n-1-1-2+1)次在做同样的事情,因此很显然不是i而是k,没有太深入的研究这个问题,只是看过你的代码后发现这个问题,在结合几个示例运行后都是正确的,所以问题应该是出在这。比如,n = 12,输出10 n = 13,输出13;  n = 14,输出2;这和笔算的是一致的.
      

  2.   

    这是我写的,你可以参考下:
    package com.xinzhan.test;import java.util.Scanner;public class TestThree {
    public static void main(String[] args) {
    System.out.println("请输入游戏总人数");
    Scanner input = new Scanner(System.in);
    int num=input.nextInt();
    new TestThree().test(num);
    }
    public void test(int num){
    int count=0;//计数器,当满3时,清零
    int number=0;//flag为零计数器
    int[] arr = new int[num];
    int[] flag = new int[num];
    //赋初始值
    for(int i=0;i<num;i++){
    arr[i]=i+1;
    flag[i]=1;
    }
        //当flag中还有一个为1时,停止循环
       while(num-number>1){
       for(int i=0;i<num;i++){
       if(flag[i]!=0){
       count++;
       }
       if(count==3){
       flag[i]=0;
       count=0;
       number++;
       }
       }  
       }
       //打印出结果
       for(int i=0;i<num;i++){
       if(flag[i]==1){
      System.out.println("最后一个人的留的人的原始序号为:"+(i+1)); 
       }
       }
    }
    }
      

  3.   

    五楼:好像这个数组没用吧!int[] arr = new int[num];
      

  4.   

    /* 【程序37】
    题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 
    */
    import java.util.Scanner;public class Cx37 { public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    System.out.println("请输入n的值: ");
    int n = sc.nextInt();
    int[] array = new int[n];
    int[] array2 = new int[array.length];
    for (int i = 0; i < n; i++) {
    array[i] = i + 1;
    }
    int i = 0;
    boolean done = false, donerank = false;
    while (array.length > 1) {
    i += 3;
    while ((i - 1) >= array.length) {
    donerank = false;
    if (done == true) { // 建立新数组,整理元素
    array2 = new int[array.length];
    for (int j = 0; j < array.length; j++) { // 复制原array数组
    array2[j] = array[j];
    }
    int num = 0;
    for (int j = 0; j < array.length; j++) { // 计算应该减去多少个元素
    if (array[j] == 0) {
    num++;
    }
    }
    array = new int[array.length - num];
    int l = 0;
    for (int j = 0; j < array.length; j++) { // 为新数组array赋值
    while (array2[l] == 0) {
    l++;
    }
    array[j] = array2[l];
    l++;
    }
    i = i - array2.length;
    done = false;
    donerank = true;
    }
    if (donerank == false)
    i = i - array.length;
    }
    if (array.length > 1) {
    array[i - 1] = 0;
    done = true;
    }
    }
    System.out.println("最后剩下: " + array[0] + " 号."); }}这是我第一次做这个题写的。可读性很差,一样的题目