中意知识网 中意知识网

当前位置: 首页 » 常用知识 »

约瑟夫问题(c)

约瑟夫问题(c)描述约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。输入每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m,n <=300)。最后一行是:0 0样例输入6 212 48 30 0样例输出517

约瑟夫问题是经典的算法题,大多教材上都有的,以下是我写的,供参考:

#include
#define N 30
int yuesefu1(int data[], int sum, int k)
{
   int i = 0, j = 0, count = 0;
   while(count < sum - 1)
   {
       if(data[i] != 0) /*当前人在圈子里*/
           j++;
       if(j == k) /*若该人应该退出圈子*/
       {
           data[i] = 0; /*0表示不在圈子里*/
           count++;/*退出的人数加1*/
           j = 0; /*重新数数*/
       }
       i++;/*判断下一个人*/
       if(i == sum) /*围成一圈*/
           i = 0;
   }
   for(i = 0; i < sum; i++)
       if(data[i] != 0)
           return data[i];/*返回最后一个人的编号*/
}

int main()
{
   int data[N], total, k, i;
   while(1)
   {
       scanf("%d%d", &total, &k);
       if(total == 0 || k == 0)
           break;
       for(i = 0; i < total; i++)
           data[i] = i + 1; //初始化
       printf("%d\n", yuesefu1(data, total, k));
   }
   return 0;
}


未经允许不得转载: 中意知识网 » 约瑟夫问题(c)