

题目
解决代码及点评
/*
n 个数字(0,1,…,n-1)形成一个圆圈,从数字 0 开始,每次从这个圆圈中删除第 m
个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,
从被删除数字的下一个继续删除第 m 个数字。求出在这个圆圈中剩下的最后一个数字。
*/
#include <iostream>
using namespace std;
// 链表节点,我们使用链表来进行操作,目的是为了简化,当有人退出时,在链表删除更加方便
struct LinkNode
{
LinkNode(int n):nValue(n){}
int nValue;
LinkNode *pNext;
};
int main()
{
int m, n, i;
cout<<"请输入n的值:";
cin>>n;
cout<<"请输入m的值:";
cin>>m;
// 建立 0~n+1的链表
LinkNode *pHead = new LinkNode(0);
pHead->pNext = pHead;
LinkNode *pCur = pHead;
for (i = 1; i < n; i++)
{
LinkNode *pTmp = new LinkNode(i);
pCur->pNext = pTmp;
pTmp->pNext = pHead;
pCur = pCur->pNext; // pCur总是指向最后一个节点,每次都把新节点加入到pCur后面
}
// 游戏在这里开始
while (pHead != pHead->pNext) // 当环形单链表只剩下一个元素时,就结束 pHead == pHead->pNext表示只有一个元素
{
for (i = 1; i < m-1; i++) // 在这里数数
{
pHead = pHead->pNext;
}
// 数到之后开始删除操作
pHead->pNext = pHead->pNext->pNext; //删除pHead的下一个元素
pHead = pHead->pNext; //将pHead下移一位,从删除的下一位开始重新数
}
// 最后打印剩下的value
cout<<pHead->nValue<<endl;
return 0;
system("pause");
return 0;
}
代码下载及其运行
代码下载地址:http://download.youkuaiyun.com/detail/yincheng01/6704519
解压密码:c.itcast.cn
下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:
1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”
2)在下拉框中选择相应项目,项目名和博客编号一致
3)点击“本地Windows调试器”运行
程序运行结果