约瑟夫问题(猴子选大王)

来源:互联网 发布:淘宝卖家店名 编辑:程序博客网 时间:2024/05/17 04:16

问题描述

约瑟夫问题:有n只猴子,按顺时针方向围成一圈选大王(编号从1到n),从第1号开始报数,一直数到m,数到m的猴子退出圈外,剩下的猴子再接着从1 开始报数。就这样,直到圈内只剩下一只猴子时,这个猴子就是猴王,编程求输入n,m后,输出最后猴王的编号。

输入数据

每行是用空格分开的两个整数,第一个是 n, 第二个是 m ( 0 < m, n < 300)。最后一行是:0 0

输出要求

对于每行输入数据(最后一行除外),输出数据也是一行,即最后猴王的编号

输入样例:

6 2

12 4

8 3

0 0

输出样例:

5

1

7

#include#define MaxSize 1024int jose(int mon[],int n,int m){    int b[MaxSize]; int count=0;    //count是记录退出圈外的猴子个数 int i=-1;        //从0号位置的猴子开始计数 int k; int d;    for(k=0;k {  mon[k]=k+1;    //设置猴子的编号 } while(count {        d=0;  while(d  {   i=(i+1)%n;    //循环选取   if(mon[i]!=0)    d++;  }  b[count]=mon[i];     //将出列的猴子存至数组b中  mon[i]=0;  count++; }// for(i=0;i// {//  printf("%d ",b[i]);// } return b[n-1];}void main(){    int n,m; int king[MaxSize]; int i=0,j,num=0; int mon[MaxSize]; printf("输入n和m的值:\n"); while(scanf("%d %d",&n,&m)==2) {            if(m==0&&n==0)   {    break;   }   else   {           king[num]=jose(mon,n,m);     num++;   } } printf("输出最后猴王的编号:\n"); for(j=0;j printf("%d\n",king[j]);     } 


0 0
原创粉丝点击