习语言编程求解 约瑟夫环问题
程序代码文件“约瑟夫环问题.习”内容如下:程序名称:约瑟夫环问题
程序功能:
作者:
单位:
时间:
概述:
设有n个人围坐在圆桌周围,现从某个位置m(1≤m≤n)上的人开始报数,报数到k的人就站出来。下一个人,即原来的第k+1个位置上的人,又从1开始报数,再报数到k的人站出来。依此重复下去,直到全部的人都站出来为止。试设计一个程序求出出列序列。
输入:三个数,分别是n,m,k
输出:出列的顺序
算法描述:
动态分配一块内存构造数组模拟队列,队列内存人编号,模拟报数过程,碰到出列的人就排到队列末尾, 直到只剩一个人,停止。
队列从尾部到头部打印出内容即为出列顺序。
运行流程:
〖
#包含 “习语言系统.接口”
整数类型 主函数(整数类型 参数个数, 字符串类型 参数[] )
开始
自然数 甲,乙,丙, 总人数, 起始位置, 出列数字, *队列, 当前人数,报数, 位置;
输出字符串并换行("习语言实现约瑟夫环问题求解开始");
【输入】
格式输出(“%(换行)请输入总人数n,起始位置m,出列数字k,以空格分隔:”);
格式输入(“%(自然数) %(自然数) %(自然数)”, &总人数, &起始位置, &出列数字 );
格式输出(“总人数= %(自然数), 起始位置=%(自然数), 出列数字= %(自然数)%(换行)”,总人数, 起始位置, 出列数字 );
如果( 总人数 小于 1或 起始位置 等于 0 或 起始位置 大于 总人数 或 出列数字 小于 1 )
{
输出字符串并换行("输入错误!");
暂停();
返回 1;
}
【申请内存及初始化】
队列 = (自然数 *)申请内存数组(总人数+1, 类型长度(自然数));
步进循环( 甲 赋值 1;甲 小于等于 总人数; 甲 加加 )
队列[甲] = 甲;
【运算开始】
当前人数 = 总人数;
报数 = 1;
位置 = 起始位置;
当( 当前人数 大于 1 ) 重复
{
如果( 报数 等于 出列数字 )
{【出列处理】
乙 = 队列[位置];
步进循环( 甲 = 位置; 甲 小于 当前人数; 甲 加加 )
队列[甲] = 队列[甲+1];
队列[当前人数] = 乙;
当前人数 --;
报数 = 1;
}
否则
{
报数 加加;
位置 加加;
}
如果(位置 大于 当前人数 )
位置 = 1;
}
【出列顺序为数组内容,倒着从尾部到头】
格式输出(“出列序列为:%行”);
步进循环( 甲 = 总人数; 甲 大于 0 ; 甲 -- )
{
格式输出(“%(自然数)、”, 队列[甲]);
}
格式输出(“%行%行”);
释放内存( 队列 );
输出字符串并换行("习语言实现约瑟夫环问题求解结束");
暂停();
返回 0;
结束
〗
修订历史:
运行结果如下:
页:
[1]