读书人

大家来帮小弟我看看这个简单的有关问题

发布时间: 2012-02-05 12:07:15 作者: rapoo

大家来帮我看看这个简单的问题!!
帮我看看啊,这个程序出错在哪,就是n个人围成一圈,顺序排号,从第一个人开始报数,(从1~3),凡报到3的人退出圈。问最后的留下的人原来排在几号?
#include <iostream>
using namespace std;
int main()
{
int a[50],*p,m,i=0,k=0,n;
cin> > n;
p=a;
for(i=0;i <n;i++)
*(p+i)=i+1;
for(m=0;m <n-1;)
{
if(*(p+i)!=0)
k++;
if(k==3)
{
*(p+i)=0;
m++;
k=0;
}
i++;
if(i==n)
i=0;
}
for(i=0;i <n;i++)
if(*(p+i)!=0)
cout < <*(p+i);
return 0;
}

[解决办法]
约色夫循环
int Josephus(int people,int passes)
{
list <int> the_list;
list <int> ::iterator iter,next;

//construct the list
for(int i=1; i <= people; ++i)
{
the_list.push_back(i);
}

//play the game
for( iter=the_list.begin(); people-- != 1; iter=next )
{
for( int i=0; i <passes; ++i)
{
++iter; //advance
if( iter == the_list.end() ) //if past last player the go to first
{
iter=the_list.begin();
}
}
next=iter; //maintain next node ,for player who is after removed player
++next;
the_list.erase(iter); //removed player

if( next == the_list.end() )
{
next=the_list.begin();
}
}

return *iter;
}

读书人网 >C++

热点推荐