问题及代码
/*
* Copyright (c) 2014, 烟台大学计算机学院
* All rights reserved.
* 文件名称:test.cpp
* 作 者:辛彬
* 完成日期:2015 年 1 月 30 日
* 版 本 号:v1.0
*
* 问题描述:猴子选大王(约瑟夫问题)。
* 输入描述:人数和选择的数。
* 程序输出:最后剩下的人的编号。
*/
#include <iostream>
using namespace std;
int main( )
{
cout<<"请输入猴子的个数:";
int n,i,m,die=0,count=0; //die为出局人数,count为数的数
cin>>m;
int a[1000];
for(i=0; i<m; i++)
a[i]=1; //先把所有人赋值为1,表示留在场上
cout<<"请输入循环的数字:";
cin>>n;
for(i=0; i<m; i++)
{
if(a[i]==1)
count++; //还留在场上的人继续计数
if(count==n) //一旦数的数为之前选定的数,此人的值变为0,退出游戏,同时count变回0,出局人数加1
{
die++;
a[i]=0;
count=0;
}
if(die==m-1) //还剩一个人的时候,循环结束
break;
if(i==m-1) //数数的人为最后一个时,重新回到第一个人
i=-1;
}
for(i=0; i<m; i++)
if(a[i]==1)
cout<<"最后留下的编号为:"<<i+1;
return 0;
}
运行结果:
学习感悟:以前就做过这种问题,把所有人的数字初始化为1,当数到那个数字的时候就变成0,同时记录下淘汰人数,当只剩下一个人的时候,循环结束,找到剩下的那个数字为1的人的编号。