借鉴了高级语言中链表的数据结构,构造环链表(只定义了创建和删除两个函数)。
没有针对顶楼的题目,算法根据更一般的Joseph描述:编号为1,2...,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为开始报数值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止。报m的人出列,将他的密码作为新的m值,从他在顺时针方向的下一个人开始重新报数,如此循环,直至所有人出列。- @echo off&setlocal enabledelayedexpansion
- :begin
- set /p "person_number=请输入人数:"
- set /p "begin_number=请输入开始报数值:"
- call :create
- set /a cur=0,deleted=0,num=begin_number
- set /p=出列顺序:<nul
- for /l %%i in (1 1 !person_number!) do (
- call :delete !cur! !num!
- set /p= !deleted!<nul
- )
- pause>nul&echo.&echo.
- goto begin
-
- :create
- set /p "passwords=请输入这!person_number!个人的密码:"
- set /a n=1
- for %%i in (!passwords!) do set /a .!n!_code=%%i,.!n!_next=n+1,n+=1
- set .!person_number!_next=1
- set .0_next=1
- goto :eof
-
- :delete
- set cur=%~1
- for /l %%i in (2 1 %~2) do call set cur=%%.!cur!_next%%
- set /a deleted=.!cur!_next
- set /a .!cur!_next=.!deleted!_next
- call set num=%%.!deleted!_code%%
- goto :eof
复制代码 没有对输入的数据检查,测试时注意查看有没有输错。 |