問題是這樣的:n個人參加遊戲,從1開始報數,報到3的退出遊戲,最後勝利的是幾號?
解法一:循環數組
#include<iostream>
#include<cassert>
using namespace std;
#define DENGER_NUM 3
int joseph(int n)
{
assert(n>0);
int *arr=(int*)malloc(sizeof(int)*n);
int i=0;//數組的下標
int count=n;//參與遊戲的人數
int tmp=0;
//1表示還在,0表示已經出局
for(i=0;i<n;i++)
{
arr[i]=1;
}
i=0;
while(count>1)//count一定要大於1,不能大於0
{
if(arr[i]==1)
{
tmp++;
if(tmp==DENGER_NUM)
{
arr[i]=0;
tmp=0;
count--;
}
}
i++;
i=(i+n)%n;
}
for(i=0;i<n;i++)
{
if(arr[i]==1)
break;
}
return i+1;
}
int main()
{
cout<<joseph(1)<<endl;
cout<<joseph(2)<<endl;
cout<<joseph(3)<<endl;
cout<<joseph(4)<<endl;
return 0;
}
形成循環數組,邊界的做法可如下:
i=(i+n)%n;
或者 if(n==n) i=0;
或者 i=(i==n-1) ?0 : i+1;
解法二:循環鏈表
#include<iostream>
#include<cassert>
using namespace std;
#define DENGER_NUM 3
typedef struct Node
{
int data;
Node* next;
}Node;
Node* BuyNode()
{
Node* s=(Node*)malloc(sizeof(Node));
if(NULL==s)
exit(1);
memset(s,sizeof(Node),0);
return s;
}
Node* Create(int n)
{
assert(n>0);
Node* head=BuyNode();
Node* p=head;
Node* s=NULL;
int i=1;
while(i<=n)
{
s=BuyNode();
s->data=i++;
//s->next=p->next;
p->next=s;
p=s;
}
p->next=head->next;//構成循環鏈表
free(head);
head=NULL;
return p->next;//返回循環鏈表的頭
}
int main()
{
int n;
while(1)
{
cout<<"Please Input People_num:";
cin>>n;
Node* p=Create(n);//創建一個循環鏈表,p指向頭
Node* tmp=NULL;//出局
while(p!=p->next)
{
for(int i=1;i<DENGER_NUM-1;i++)//DENGER_NUM-1主要是爲了讓p指向刪除的前驅
{
p=p->next;
}
tmp=p->next;
p->next=tmp->next;
free(tmp);
tmp=NULL;
p=p->next;
}
cout<<"最後勝利的是"<<p->data<<endl;
}
return 0;
}