C++ 结构有n个人围成一圈,顺序排号。从第一个开始报数(从1到3报数),凡报到3的人退出圈子,(用结构)
有n个人围成一圈,顺序排号。从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。(用结构)...
有n个人围成一圈,顺序排号。从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。(用结构)
展开
2个回答
展开全部
int g_all_num = 0;//记录当前所有人数
int g_now=0;//人数计数 将g_now==3 的人的
struct Number
{
bool bOut;//是否已退出
int iSelf;//记录自己位置
Number* next;//指向下一个
};
用上面结构体做个链表,添加所有人,做成圆形链表
//一次踢人判断如下
Number* tNumber = ***;//链表的元素
if(g_all_num==1)
{
if(!tNumber->bOut)//这个人未被T
{
g_now++;
if(g_now == 3)
{
g_all_num --;
tNumber->bOut = true;//T掉这个人
g_now = 0;
}
}
// 这边跳到链表下个元素 再进行t人判断
}
else
{
//已经结束 当前这个的为最后剩下的
}
int g_now=0;//人数计数 将g_now==3 的人的
struct Number
{
bool bOut;//是否已退出
int iSelf;//记录自己位置
Number* next;//指向下一个
};
用上面结构体做个链表,添加所有人,做成圆形链表
//一次踢人判断如下
Number* tNumber = ***;//链表的元素
if(g_all_num==1)
{
if(!tNumber->bOut)//这个人未被T
{
g_now++;
if(g_now == 3)
{
g_all_num --;
tNumber->bOut = true;//T掉这个人
g_now = 0;
}
}
// 这边跳到链表下个元素 再进行t人判断
}
else
{
//已经结束 当前这个的为最后剩下的
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐于2018-03-13
展开全部
//创建含有n个节点的环形链表,每次在这个链表中删除第m个节点,返回最后剩下的节点。
#include <iostream>
#include <list>
#include <numeric>
#include <algorithm>
using namespace std;
int fun(unsigned int n, unsigned int m)
{
if (n<1 ||m<1)
{
return -1;
}
unsigned int i = 0;
list<int>numbers;
for (i = 0;i<n; ++i)
{
numbers.push_back(i);
}
list<int>::iterator current = numbers.begin();
while (numbers.size()>1)
{
for (int i = 1;i<m; ++i)
{
current++;
if (current == numbers.end())
{
current = numbers.begin();
}
}
list<int>::iterator next = ++current;
if (next == numbers.end())
{
next = numbers.begin();
}
--current;
numbers.erase(current);
current = next;
}
return *current;
}
int main(int argc, char* argv[])
{
int nLeave = fun(10, 3);
printf("如果n = 10,数到3的人退出,最后剩下的是%d\n", nLeave );
return 0;
}
帮你打了半天,给分哦~
#include <iostream>
#include <list>
#include <numeric>
#include <algorithm>
using namespace std;
int fun(unsigned int n, unsigned int m)
{
if (n<1 ||m<1)
{
return -1;
}
unsigned int i = 0;
list<int>numbers;
for (i = 0;i<n; ++i)
{
numbers.push_back(i);
}
list<int>::iterator current = numbers.begin();
while (numbers.size()>1)
{
for (int i = 1;i<m; ++i)
{
current++;
if (current == numbers.end())
{
current = numbers.begin();
}
}
list<int>::iterator next = ++current;
if (next == numbers.end())
{
next = numbers.begin();
}
--current;
numbers.erase(current);
current = next;
}
return *current;
}
int main(int argc, char* argv[])
{
int nLeave = fun(10, 3);
printf("如果n = 10,数到3的人退出,最后剩下的是%d\n", nLeave );
return 0;
}
帮你打了半天,给分哦~
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询