C#任意输入人数 , 按照1-3报数 ,直到剩下最后一个人为止,输出喊到3的人和最后剩下的人的编号

C#任意输入人数 , 按照1-3报数 ,直到剩下最后一个人为止,输出喊到3的人和最后剩下的人的编号

典型的约瑟夫环问题
参考:http://developer.51cto.com/art/200908/143294.htm
http://www.cnblogs.com/CSharpSPF/p/3508054.html

约瑟夫环问题 如果有上过数据结构或者算法的课程的话 书上是有源码的

public class Josephas

//从第start人开始计数,以alter为单位循环记数出列,总人数为total

public int [ ] Jose(int total, int alter, int start)

{

int i, j, k = 0;

    //count数组存储按出列顺序的数据,以当结果返回   
    int[] count = new int [ total+1];      

    //s数组存储初始数据   
    int[] s = new int [ total+1];       

    //对数组s赋初值,第一个人序号为0,第二人为1,依此下去  
    for (i = 0; i <total; i++)       
    {   
        s[i] = i;   
   }   

    //按出列次序依次存于数组count中   
    for (i = total; i >= 2; i--)        
   {   
        start = (start + alter - 1) % i;   
        if (start == 0)   
            start = i;   
        count[k] = s[start];   
        k++;   
        for (j = start + 1; j <= i; j++)           
     s[j - 1] = s[j];   
    }                 
    count[k]=s[1];   

    return count;       
}   

}