zl程序教程

您现在的位置是:首页 >  其它

当前栏目

解答私信@m0_51085291 //2020-12-22

12 2020 22 解答 私信
2023-09-27 14:19:40 时间

一群小孩围成一圈,每个小孩都会带有一个随机的密码。然后设定一个数 m,从第一个小孩数起,数 到第 m 个的时候,该小孩离开。小孩离开时,其携带的密码将更新这个 m 值,顺序往下数的第 m 个小孩 会继续出列。依次这样数下去,最后一个小孩是胜利者,问:胜利者是第几个小孩?

【设计需求及分析】
使用单循环链表实现。程序开始需要设定以下值:
(1)有多少个小孩参与游戏(一般设定值小于 100);
(2)第一个报到哪个数必须出列 (一般设定值小于 100);
(3)随机生成每个小孩(约瑟夫环结点)携带的密码。:
【测试数据】
测试数据:
参与游戏的人数:6
报第一个出列数:8
小孩携带的随机密码(小孩编号:随机密码):
1:5 2:9 3:12 4:2 5:5 6:2
2 的小孩离队了,他携带的密码是 9
6 的小孩离队了,他携带的密码是 2
3 的小孩离队了,他携带的密码是 12
1 的小孩离队了,他携带的密码是 5
4 的小孩离队了,他携带的密码是 2
最后编号 5 的小孩获胜!

代码块:

/*根据CSDN几位战友的反馈,VC6.0下运行报错问题,自行百度搜索了一下,
在头一行加入头文件 include "stdafx.h" */

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

#define MAXCHILD 100
#define MAXCOL 15
#define MAXRANDPASS 20

struct Child
{
	int number;
	int password;
	Child *next;
};

void SetValue(int *childNum, int *firstOut);
void InputChildData(Child *children, int childNumb);
void Winner(Child *children, int childNumb, int *firstOut);

void SetValue(int *childNum, int *firstOut)
{
	cout<<"参与游戏的人数:";
	cin>>*childNum;
	while(*childNum>=MAXCHILD)
	{
		cout<<"人数必须小于"<<MAXCHILD<<",请重新输入:";
		cin>>*childNum;
	}
	cout<<"报第一个出列数:";
	cin>>*firstOut;
	while(*firstOut>=MAXCOL)
	{
		cout<<"出列数必须小于"<<MAXCOL<<",请重新输入:";
		cin>>*firstOut;
	}
}//SetValue
void InputChildData(Child *children, int childNumb)
{
	Child *p;
	int i;
	cout<<"小孩携带的随机密码(小孩编号:随机密码):"<<endl;
	for(i=0, p=children; i<childNumb; p=p->next, i++)
	{
		p->number=i+1;
		p->password=rand()%MAXRANDPASS+1;
		cout<<p->number<<":"<<p->password<<" ";
		if(i==childNumb-1)
			break;
		p->next=new struct Child;
	}
	p->next=children;
	cout<<endl;
}//InputChildData
void Winner(Child *children, int childNumb, int *firstOut)
{
	Child *p;
	int childCount=childNumb, step=*firstOut, i;
	for(p=children, i=0; childCount!=1; p=p->next)
	{
		if(p->number==0)
			continue;
		i++;
		if(i==step&&p->number!=0)
		{
			cout<<p->number<<" 的小孩离队了,他携带的密码是 "<<p->password<<endl;
			step=p->password;
			cout<<"step:"<<step<<endl;
			p->number=0;
			i=0;
			childCount--;
		}
	}
	for(p=children; !p->number; p=p->next);
	cout<<"最后编号 "<<p->number<<" 的小孩获胜!"<<endl;
}//Winner


int main()
{
	int *childNumber=new int;
	int *firstOut=new int;
	SetValue(childNumber, firstOut);
	Child *child=new struct Child;
	srand((unsigned)time(NULL));
	InputChildData(child, *childNumber);
	Winner(child, *childNumber, firstOut);
	free(childNumber);
	free(firstOut);
	free(child);

	system("pause");
	return 0;
}