小说封面字体在线生成:急求解决约瑟夫问题!

来源:百度文库 编辑:查人人中国名人网 时间:2024/04/25 10:10:11
设有n个围坐一圈,现在从某一个人开始报数,数到m的人出列,接着从出列的下一个人开始重新报数,数到m的人出列,如此下去,直到所有的人都出列为止。试设计确定他们的出列次序序列的程序

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
int a[17]={0};
int i, j, s;

for (i = 0;i < 17;i++)
{
a[i] = i + 1; /* 填空数组,编号是下标加一,注意C语言中的数组下标从0开始 */
}
i=0;
s=17;
j=0;
while(s > 1)
{
if(a[i%17] != 0)
{
if((i+1-j)%3 == 0)
{
printf("%d\n",a[i%17]); /* 把这个家伙打印出来 */
a[i%17] = 0;
s--;
}
}
else
j++;
i++;
}

for(i=0; i<17; i++)
if(a[i] != 0)
printf("最后一个是:%d\n",a[i]);
system("pause");
return 0;
}

直接模拟就可以了。
#include<iostream.h>
#include<string.h>
//结构链表定义
typedef struct List
{
bool IsOn;//状态:ture未离开
int num;//编号
int psw;//密码
List*pnext;
}*PList;
//函数执行结果状态定义
enum Status{ERROR_OK=0,ERROR_MEMORY_FALIED,ERROR_INPUT_NUM,ERROR_NOPERSON,ERROR_NUM};
void GetErrorMsg(const Status &errorCode)//显示错误信息
{
char msg[256];
switch(errorCode)
{
case ERROR_OK:
strcpy(msg,"执行成功!");
break;
case ERROR_MEMORY_FALIED:
strcpy(msg,"内存错误:没有足够大的内存!");
break;
case ERROR_INPUT_NUM:
strcpy(msg,"输入数据错误!");
break;
case ERROR_NUM:
strcpy(msg,"数据错误!");
break;
case ERROR_NOPERSON:
strcpy(msg,"错误:此编号的人不存在!");
break;
default:
strcpy(msg,"未知错误!");
}
cout<<msg<<endl;
}
Status CreateList(PList&pls,const int num)//创建链表
{
//如果链表初始大小不合法返回
if(num>30||num<=0)
return ERROR_NUM;
//创建指定大小的循环链表
PList pTemp=new List;
pls=pTemp;
pls->num=1;
pls->IsOn=true;
for(int i=1;i<num;i++)
{
pTemp->pnext=new List;
if(pTemp==NULL)
return ERROR_MEMORY_FALIED;
pTemp=pTemp->pnext;
pTemp->num=i+1;
pTemp->IsOn=true;
pTemp->pnext=NULL;
}
pTemp->pnext=pls;

return ERROR_OK;
}
Status InputPassWord(PList&pls,const int num)//输入密码
{
//编号不合法返回
if(num<=0)
return ERROR_INPUT_NUM;
PList pTemp=pls;

for(int i=1;i!=num;i++)
{
pTemp=pTemp->pnext;
}

if(num==i)
{
cin>>pTemp->psw;
if(pTemp->psw<=0)
return ERROR_INPUT_NUM;
else
return ERROR_OK;
}
else
return ERROR_INPUT_NUM;

}

Status ShowResult(const PList&pls,const int &m)//显示模拟结果
{
//初始密码不合法返回
if(m<=0)
return ERROR_INPUT_NUM;
//链表未空返回
if(pls==NULL)
return ERROR_NUM;
//计算链表中元素个数
int num=0;
PList pTemp=pls;
do{
num++;
pTemp=pTemp->pnext;
}while(pTemp!=pls);
int i=0,j,ps=m;
while(i!=num)
{
if(i==0)//第一次时将移动次数减1
ps--;
for(j=0;j<ps;j++)
{
do{
pTemp=pTemp->pnext;//如果状态未离开指针向后移动
}while(!pTemp->IsOn);

}
pTemp->IsOn=false;//将状态设为离开
cout<<"第"<<i+1<<"个出列的编号为:"<<pTemp->num<<endl;
ps=pTemp->psw;//获取密码
i++;//状态为离开人数加1
}
return ERROR_OK;//返回成功
}

void main()
{
cout<<"*************************************"<<endl
<<"*******欢迎使用约瑟夫环模拟程序******"<<endl
<<"*************************************"<<endl
<<endl;
cout<<"****************数据输入*************"<<endl
<<"*************************************"<<endl;
PList pls=NULL;
int iTemp;
Status errorCode;
cout<<"**********Step1:环中人数输入*********"<<endl;
do{
cout<<"请输入模拟环中的人数:";
cin>>iTemp;
errorCode=CreateList(pls,iTemp);//创建链表
GetErrorMsg(errorCode);//输出CreateList函数执行情况
}while(!(ERROR_OK==errorCode));//如果CreateList不成功重新创建
cout<<"************Step2:密码输入***********"<<endl;
for(int i=1;i<=iTemp;i++)
{
cout<<"请输入第"<<i<<"个人的密码:";
errorCode=InputPassWord(pls,i);//输入密码

while(errorCode!=ERROR_OK) //如果密码输入失败重新输入
{
GetErrorMsg(errorCode);//输入出错信息
cout<<"请输入第"<<i<<"个人的密码:";
errorCode=InputPassWord(pls,i);
}
}
cout<<"**********Step3:初始密码输入*********"<<endl;
do{
cout<<"请输入初始密码:";
cin>>iTemp;
cout<<"**********程序执行结果***********"<<endl
<<"**********************************"<<endl;
errorCode=ShowResult(pls,iTemp);//模拟结果
GetErrorMsg(errorCode);//输入程序执行情况
}while(ERROR_OK!=errorCode);

}