1、数组解法
注意需要设三个变量:c用于报数,i用于遍历队列,peo计算剩余人数
#include<iostream>
using namespace std;
int n,m;
void solve()
{
int i,c,peo;
int a[301];
for (i=1;i<=n;i++)
a[i]=i;
c=0;i=0;peo=0;
while(peo<n-1)
{
i++;
if (i>n) i=1;
if (a[i]==0) continue;
c++;
if (c%m==0)
{
peo++;
a[i]=0;
}
}
for (i=1;i<=n;i++)
if (a[i]!=0)
break;
cout<<a[i]<<endl;
}
int main()
{
while(cin>>n>>m)
{
if (n==0 && m==0)
break;
solve();
}
return 0;
}
2、链表实现
两个变量:i计算剩余人数,c用于报数
#include<iostream>
using namespace std;
int n,m;
struct node
{ int v;node *next;};
void solve()
{
int i,c;
node *head,*p,*q,*bef;
head=new node;p=new node;bef=new node;
head->next=p;
for (i=1;i<=n;i++)
{
p->v=i;
q=new node;
p->next=q;
bef=p;
p=q;
}
bef->next=head->next;
p=head->next;bef=head;
i=0;c=0;
while(i<n-1)
{
c++;
if (c%m==0)
{
bef->next=p->next;
free(p);
p=bef->next;
i++;
}
else
{
bef=p;
p=p->next;
}
}
cout<<p->v<<endl;
}
int main()
{
while(cin>>n>>m)
{
if (n==0 && m==0)
break;
solve();
}
return 0;
}
3254:约瑟夫问题No.2:加入输出,从第pp个人开始报数
#include<iostream>
using namespace std;
int n,m,pp;
struct node
{ int v;node *next;};
void solve()
{
int i,c;
node *head,*p,*q,*bef;
head=new node;p=new node;bef=new node;
head->next=p;
for (i=1;i<=n;i++)
{
p->v=i;
q=new node;
p->next=q;
bef=p;
p=q;
}
bef->next=head->next;
p=head->next;bef=head;
for (i=1;i<pp;i++)
{ bef=p;p=p->next; }
i=0;c=0;
while(i<n-1)
{
c++;
if (c%m==0)
{
bef->next=p->next;
cout<<p->v<<",";
free(p);
p=bef->next;
i++;
}
else
{
bef=p;
p=p->next;
}
}
cout<<p->v<<endl;
}
int main()
{
while(cin>>n>>pp>>m)
{
if (n==0 && m==0)
break;
solve();
}
return 0;
}