/**面试题12
*约瑟夫问题的解答
*1-N个人围成一圈,从1到M进行报数,每次报到M的人退出,一次循环,那么最后一个人退出的是谁?
*
*/
//结构体和函数声明
typedef struct yuesefu
{
int data;
yuesefu *next;
}yuesefu;
//构造节点为N的单向循环链表
yuesefu * yuesefu_create(int n)
{
yuesefu * pRet = NULL;
if (0 != n) {
int n_index = 1;
yuesefu *pNode = NULL;
pNode = new yuesefu[n];
if (NULL == pNode) {//申请内存失败,返回NULL
return NULL;
}else{
memset(pNode, 0, n*sizeof(yuesefu));//初始化内存
}
pRet = pNode;
while (n_index < n) {//构建循环链表
pNode->data = n_index;//初始化链表的每个节点,从1到N
pNode->next = pNode + 1;
pNode = pNode->next;
n_index++;
}
pNode->data = n;
pNode->next = pRet;
}
return pRet;
}
int main(int argc, const char * argv[]) {
//约瑟夫问题的解答
yuesefu * pList =NULL;
yuesefu * pIter =NULL;
int n =12;
int m =3;
/**构造单向循环链表*/
pList = yuesefu_create(n);
pIter = pList;
m %= n;
cout<<m<<endl;
while (pIter != pIter->next) {
int i=1;
/*取到第M-1个节点*/
for (;i < m-1; i++) {
pIter = pIter->next;
}
/*输出第M个节点的值*/
printf("p->next = %d\n",pIter->next->data);
/*从链表中删除第M个节点*/
pIter->next = pIter->next->next;
pIter = pIter->next;
}
printf("最后一个节点:%d\n",pIter->data);
/*释放申请的内存*/
delete [] pList;
return 0;
}
C++程序实现:
int n,m,s=0;
cout<<"N:";cin>>n;
cout<<"M:";cin>>m;
for(int i=2;i<=n;i++)
{
s=(s+m)%i;
}
cout<<"最后一个是:"<<s+1;
如果有任何问题,欢迎下方留言谈论,或者加入QQ群83459374交流