求一个编程题答案

有一道题:有1-N个人,顺时针围成一个圈,从第1个人开始报数,当报到5或5的倍数时,该人退出圈,继续报数,把退出圈的人按退出顺序列出号码

程序用啥语言都行,主要看思路。

约瑟夫问题 报数分为杀1留2,即1,2,1,2报数,报1的人死,报2的人留下。
杀2留1,即1,2,1,2报数,报1的人留下,报2的人死。
约瑟夫问题是个有名的问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。
假定在圈子里前K个为好人,后K个为坏人,你的任务是确定这样的最少M,使得所有的坏人在第一个好人之前被杀掉。
C++代码示例:
#include<iostream>
using namespace std;
void main()
{
int n,m,a[101],k,i,j,num; //计数器是从1开始的,所以100个人用101
cout<<"请输入参加游戏的玩家人数(不超过100人):";
cin>>n;
cout<<"----------------------------------------"<<endl;
if(n>100)
{
cout<<"玩家太多,请重新登陆此程序!"<<endl;
return;
}
cout<<"输入游戏中要玩的数字:";
cin>>m;
cout<<"----------------------------------------"<<endl;
for(i=1;i<=n;i++)
{
a【i】=1;//注意百度百科里不让使用ASCII里的方括号,这里是中文字符集里的方括号,
}
j=0;
k=0;
for(i=1;i<=n;i++){
if(a【i】==1){
j=j+a【i】;
if(j==m)
{
j=0;
a【i】=0;
k++;
}
if(k==n){
num=i;
break;
}
}
if(i==n)
i=0;
}
cout<<"最后获胜的玩家是第 "<<num<<" 号玩家!"<<endl;
cout<<"----------------------------------------"<<endl;
}
温馨提示:答案为网友推荐,仅供参考
相似回答