约瑟夫问题(C语言)

约瑟夫问题:N个人围成一圈,从第一个人开始报数,数到M的人出圈;再由下一个人重新开始报数,数到M的人出圈;…输出依次出圈的人的编号。N,M由键盘输入。
代码如下:

/*   编写者:Zero   
     编写时间:2018年   */
#include
#define N 50
int main()
{
    int a[N],m,n,x,i,count = 0;
    printf("Please input two integers:\n");
    scanf("%d%d",&n,&m);     /*  输入总人数n和出局要报的数m */
    x = n;      /* 把n赋给x,避免使用时n被修改 */
    for(i = 1;i <= n; i++)
    {
        a[i] = i;
    }
    do
    {
        for(i =1; i<=n; i++)
        {
            if(a[i]!= 0)     /* 判断是否在上个回合出局 */
                count++;    /* 报数 */

            if(count == m)    
            {
                a[i] = 0;    /* 出局的人置为0,不参与报数 */
                count = 0;
                x--;        /* 出局一个,总人数减1 */
                printf("%d",i);
            }
        }
    }while(x>0);     /* 未淘汰完,循环继续 */
    return 0;
}

Tips:此问题还可以用循环链表来解决哦!!!

你可能感兴趣的:(新手,C语言,算法)