面试题六 C/C++面试秘笈 之约瑟夫问题的解答--程序员面试题

/**面试题12

 *约瑟夫问题的解答

 *1-N个人围成一圈,从1M进行报数,每次报到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;//初始化链表的每个节点,从1N

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交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值