一题有点难的c++问题帮帮忙啊~!

来源:百度知道 编辑:UC知道 时间:2024/06/18 16:34:13
有N个同学手拉手围成一个圈并编号为1,2,3,4,5...从1号开始每隔一个同学就除去最后剩下的为幸运者,问要站在哪个位置才能成为幸运者?前提不能用“数连”做!用C做!

经典的约瑟夫环问题,网上有很多

确实是典型的约瑟夫环,简单实现了一下,代码如下:

#include<iostream>
using namespace std;
int func(int m,int n)
{
int i,j;
int b[30],c[30];
for(i=0;i<m;i++)
{
c[i]=i; //从0--m-1号
}
while(m > 1) //人多于一个
{
for(i=n%m,j=0;i<=m-1;i++,j++)
{
b[j]=c[i]; //报到n的人号数是n%m-1,如果剩下的人m>n%m-1,则把n%m--m-1新数组中
}
for(i=0;i<n%m-1;i++)
{
b[j]=c[i]; //把n%m-1前面的人放在后面,即m-1个人又构成一新数组
}
for(i=0;i<m;i++) //copy;
{
c[i]=b[i];
}
m--; //人数减1
}
return c[0]+1; //最后剩下的人号码=c[0],数组从0号开始,所以+1
}
void main()
{
int a;
cout<<"输入总共人数:";
cin>>a;

cout<<"最后留下来的人的序号"ab(a,2)<<endl;
}

/*

VC++6.0编