小弟刚刚学java
写了一个围成圈小孩数术,每隔几个就出去,看看最后剩下谁的问题的程序
比如5个小孩,从第二个开始,每隔2个出局最后剩下第4个小孩希望大家看看有什么要改善的地方, 谢谢了
package javaApp;import java.lang.reflect.Array;public class kidsshu { /**
 * @param args
 */
public static int aktuellePostion;//记录那个位置该改为去掉
public static int zeiger;//数术
public static int anfang;//开始位置
public static int abstand;//隔几个数
public static int kids;//一共多少kids
public static int[] arraykids;
public static void main(String[] args) {
// TODO Auto-generated method stub

        kids=Integer.parseInt(args[0]);
        System.out.println(kids);
        abstand=Integer.parseInt(args[1]);
        System.out.println(abstand);
        anfang=Integer.parseInt(args[2]);
        System.out.println(anfang);
        arraykids=new int[kids];
        for(int i=0;i<kids;i++){
arraykids[i]=1;
}
        kidsshu kidsshu=new kidsshu();
        
        int ok=kidsshu.letzter(kids, abstand, anfang);
        System.out.println(ok);
}
public int letzter (int kids,int abstand, int anfang){
int letzter=0;
int outOfNumer=0;
zeiger=anfang-1;
aktuellePostion=zeiger;
int number=0;

while(outOfNumer<kids-1){  while (number!=abstand) {
if (arraykids[zeiger]!=0) {
number=number+1;
aktuellePostion=zeiger;
zeiger=zeiger+1;
if(zeiger==kids)
zeiger=0;

else {
aktuellePostion=zeiger;
zeiger=zeiger+1;
if (zeiger==kids) {
zeiger=0;
}
                
}
}
number=0;

arraykids[aktuellePostion]=0;
outOfNumer=outOfNumer+1;
}

for(int i=0;i<kids;i++){
if (arraykids[i]!=0)
letzter=i;
}


return letzter;
} }

解决方案 »

  1.   


    public static void main(String[] args){
      //初始化数据
      List<String> people = new ArrayList<String>();
      String[] names = {"卡卡西","佐助","鸣人","小樱"};
      for(String name : names){
        people.add(name);
      }

      int n=3; //数多少个就移除1个
      int count = 0; //不用设置
      int index = 0; //不用设置
      while(people.size()>1){
        count++;
        if(count==n){
          String t = people.remove(index--);
          System.out.println("REMOVE : "+t);
          count=0;
        }
        index = ++index%people.size();
      }
      System.out.println("LEAVE : "+people);
    }
      

  2.   

    ArrayList<Integer> list=new ArrayList<Integer>();
       list.add(1);
       list.add(2);
    list.add(3);
    list.add(4);
    list.add(5);while(list.size()!=1){
    for(int i=0;i<2;i++){
       list.add(list.remove(0));
    }
     list.remove(0);
    }
    System.out.println("最后剩下的是:"+list.get(0));
      

  3.   

    你的方法就有点类是 c的方法进行编写,对于一些数组的操作,java里面的 List就有提供很多方法,只要调用,就能很容易实现的,跟算法没什么的啊关系,就看你会不会用这些类所提供的方法
      

  4.   

    #include<iostream.h>
    int choose(int num,int del)
    {
    int i;
    int a[100];
    for(i=0;i<num;i++)
      a[i]=1;     //状态初始化,为1表示可能被选上,为0表明已经淘汰;int sum=0,     //循环记数;
      countOne=num;   //累积记数初始化,大于1表明未被排除;while(countOne>1)
    {
      countOne=0;
      for(i=0;i<num;i++)
      {
       sum+=a[i];
       if(sum==del)
        sum=a[i]=0;  //淘汰报到该数的人;
       countOne+=a[i];
      }
    }for(i=0;i<num;i++)
      if(a[i]!=0)
       return i;   //找到幸运编号(从0开始的);
    }void main()
    {
    int num,del;
    cout<<"请输入总数和报数的数:";
    cin>>num>>del;
    cout<<"最后剩下的人的原来的编号为:"<<choose(num,del)+1<<endl;

    这是C++的算法,LZ可以自己改下,变成java的算法,然后再跟自己的对照的看下
      

  5.   

    public class Joserv2 {
    public static void main(String[] args) {
    Vector<String> v = new Vector<String>();
    // 赋值
    String temp;
    for (int i = 1; i <= 100; i++) {
    v.add("第" + i + "个小孩");
    }
    // 计算
    while (v.size() > 1) {
    // 前两个不删
    for (int i = 0; i < 2; i++) {
    temp = v.get(0);
    v.remove(0);
    v.add(temp);
    }
    v.remove(0);
    }
    System.out.println(v);
    }
    }
      

  6.   

    public class Test {
        public static void main(String args[]) {
            int[] a = new int[7];
            int sum = 0;
            int M = 1;
            for (int n = 0; n < a.length; n++) {
                a[n] = 1;
            }
            int i = 0;
            int j = 0;
            do {
                if (i == a.length)
                    i = 0;
                sum += a[i];
                if ((sum % M == 0)&&(a[i]!=0)) {
                    a[i] = 0;
                    System.out.println(i + "out");
                    j++;
                }
                i++;
            } while (j < a.length);
            System.out.println("The last out" + (i-1)+" And come out "+j+" SUM "+sum);
        }
    }
      

  7.   

    ……约瑟夫环……
    C 代码如下:
    #define OVERFLOW -2
    typedef int Status;
    typedef int Elemtype;
    //定义数据元素类型
    typedef struct Cnode{
            Elemtype data; 
            struct Cnode *next;
            } CNode;CNode *joseph;//定义一个全局变量
            
    Status Create_clist(CNode *clist,int n){
               CNode *p,*q;
               int i;
               clist=NULL;
               for(i=n;i>=1;i--){
                  p=(CNode *)malloc(sizeof(CNode));
                      if(p==NULL)
                         return OVERFLOW;//存储分配失败
                  p->data=i;
                  p->next=clist;
                  clist=p;
                      if(i==n)
                          q=p;//用q指向链表的最后一个结点
             }
                q->next=clist;//把链表的最后一个结点的链域指向链表的第一个结点,构成循环链表
                joseph=clist;//把创建好的循环链表头指针赋给全局变量
                   return OK;
    }//end
    Status Joseph(CNode *clist,int m,int n,int k){
              int i;
              CNode *p,*q;
                 if(m>n)
                     return ERROR;//起始位置错
                 if(!Create_clist(clist,n))
                     return ERROR; //循环链表创建失败
              p=joseph; //p指向创建好的循环链表
                  for(i=1;i<m;i++)
                     p=p->next; //p指向m位置的结点
                  while(p){
                           for(i=1;i<k-1;i++)
                                p=p->next; //找出第k个结点
                          q=p->next;
                          printf("%d ",q->data);//输出应出列的结点
                    if(p->next==p) 
                          p=NULL; //删除最后一个结点
                    else {
                         p->next=q->next;
                         p=p->next;
                         free(q);
                      }
              }//while
              clist=NULL;
    }//end
         
    int main(int argc, char *argv[])
    {
         int m,n,k;
         CNode *clist;
         clist=NULL;
         printf("\n请输入围坐在圆桌周围的人数n:");
         scanf("%d",&n);printf("\n请输入第一次开始报数人的位置m:");
         scanf("%d",&m);printf("\n你希望报数到第几个数的人出列:");
         scanf("%d",&k);
         Create_clist(clist,n);
         printf("\n出列的顺序如下:\n");
         Joseph(clist,m,n,k);
        system("PAUSE");
        return EXIT_SUCCESS;
    }
      

  8.   

    现学现卖 Linkimport java.util.LinkedList;
    import java.util.List;
    public class Test {
    void josephus(int m,int n,int t){
    List<Integer> l=new LinkedList<Integer>();
    for(int i=0;i<m;l.add(++i));
    int t1=t-1;
    for(int i=0;i<m;i++){
    t1=(t1+n-1)%l.size();
    System.out.print(l.get(t1)+"\t");
    l.remove(t1);
    }
    }
    public static void main(String args[]){
    new Test().josephus(5,3,2);
    }
    }