admin 发表于 2011-9-28 22:39:07

习语言编程求解 约瑟夫环问题

程序代码文件“约瑟夫环问题.习”内容如下:

程序名称:约瑟夫环问题
程序功能:
作者:
单位:
时间:

概述:
设有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]
查看完整版本: 习语言编程求解 约瑟夫环问题