中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-13 20:37
楼 主 [已结]一道题 发表于 2008-07-08 10:57 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
UID 115804
性别 男
状态 离线
有过这样一道题,某位朋友从C题目中选出来的。。但当时讨论时这题没有给出答案。
今天忽然想起来,发上来一起做做。。。
n个人围成1圈,顺序排号,从1到3开始报数,报到3的人退出这个圈子,问最后留下的那个人是原来的几号?

[ Last edited by pusofalse on 2008-7-8 at 12:51 PM ]
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
2 发表于 2008-07-08 11:11 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
是n个人吗?没有具体的人数?
致精致简!
3 发表于 2008-07-08 11:13 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
UID 115804
性别 男
状态 离线
n 是用户输入的数字
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
4 发表于 2008-07-08 11:19 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
仍不太明白题意
假设有 a b c d e f g h 8人
当数到3时,c 退出,然后该如何?又从1开始数起吗?若是,是从a开始数还是从d开始数?
致精致简!
5 发表于 2008-07-08 11:24 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
UID 115804
性别 男
状态 离线
数到3,c退出,然后接着从d开始数1,那么轮到f数到3,f退出。g接着数1,h是2,然后接着返回a,a又退出。第二次循环时b是1,d又推出。如此循环,直到只剩一个人,问这个人是原来的几号。。。
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
6 发表于 2008-07-08 11:46 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
不知道对不对,初步测试是对的
:

@echo off&setlocal enabledelayedexpansion
set /a n=8
for /l %%a in (1 1 !n!) do set str=!str! a%%a
call :loop !str!
for %%a in (!str!) do set str=%%a
echo.&echo 最后剩下的是原来的 !str:~1! 号
pause>nul
:loop
set /a m=0,h=0
set "tmp="
for %%i in (%*) do (
set /a m+=1
if !m! equ 3 (
call set str=%%str:!tmp! %%i=%%!tmp!
for %%j in (!str!) do set /a h+=1
if !h! neq 2 call :loop !str!
)
set tmp=!tmp! %%i
)
goto :eof


[ Last edited by 26933062 on 2008-7-8 at 12:25 PM ]
致精致简!
7 发表于 2008-07-08 12:01 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
UID 115804
性别 男
状态 离线
有8个人时,留下的是原来的8号,而不是7号。
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
8 发表于 2008-07-08 12:21 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
怎么会呢?
我手工数 8 个人都是剩下 7 号啊?

1 2 3 4 5 6 7 8
1 2 4 5 6 7 8
1 2 4 5 7 8
2 4 5 7 8
2 4 7 8
4 7 8
4 7
7
致精致简!
9 发表于 2008-07-08 12:23 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
UID 115804
性别 男
状态 离线
我写了一通,发现和前辈的竟然运行结果都一样。。。完全一样。。。
@echo off&setlocal enabledelayedexpansion
set/p n=输入人数:
:1
for /l %%a in (1 1 %n%) do set nn=!nn!%%a

:2
for %%a in (%nn%) do (
set/a mm+=1
set %%a=!mm!
if !mm! equ 3 set mm=0
)

for %%a in (%nn%) do if !%%a! neq 3 set m=!m!%%a
for %%a in (%m%) do set/a x+=1
set nn=%m%
if %x% neq 1 set x=0&set m=&goto 2
echo %m%
pause


[ Last edited by pusofalse on 2008-7-8 at 12:52 PM ]
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
10 发表于 2008-07-08 12:27 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
看了 8 楼 的回帖了吗?
致精致简!
11 发表于 2008-07-08 12:35 ·  中国 山东 淄博 联通
银牌会员
★★★
积分 1,604
发帖 646
注册 2008-04-13 23:39
UID 115804
性别 男
状态 离线
SORRY

是我错了。。。
疏漏了一个。。。

[ Last edited by pusofalse on 2008-7-8 at 12:39 PM ]
心绪平和,眼藏静谧,无比安稳的火... Purification of soul...Just a false...^_^
12 发表于 2008-07-08 13:10 ·  中国 广东 韶关 电信
高级用户
★★★
CMD感染者
积分 691
发帖 383
注册 2008-05-23 00:38
UID 119451
性别 男
状态 离线
1 2 3 4 5 6 7 8
1 2 4 5 7 8
2 4 7 8
4 7
7
13 发表于 2008-07-08 14:06 ·  中国 重庆 九龙坡区 电信
版主
★★★★★
积分 9,023
发帖 5,017
注册 2007-05-31 19:39
UID 89899
性别 男
状态 离线
著名的约瑟夫环问题
14 发表于 2008-07-08 22:08 ·  中国 江苏 常州 溧阳市 电信
银牌会员
★★★
积分 2,404
发帖 946
注册 2005-09-08 13:44
UID 42345
状态 离线
Originally posted by 26933062 at 2008-7-8 11:46:
不知道对不对,初步测试是对的

@echo off&setlocal enabledelayedexpansion
set /a n=8
for /l %%a in (1 1 !n!) do set str=!str! a%%a
call :loop !str!
for %%a in (!str!) d ...

虽结贴 还是有点疑问
刚试一下 发现数字大了不行
写一个也是超1856就不行

@echo off&setlocal enabledelayedexpansion
set/a n=1856
for /l %%i in (1 1 !n!) do set str=!str! %%i
call :lp "!str!"
echo 最后剩下的是原来的 !str! 号
pause&exit
:lp
set "str="
for %%i in (%~1) do (
set/a m+=1,t=m%%3
if !t! neq 0 set str=!str! %%i&set/a p+=1
)
if !p! gtr 1 set p=&call:lp "!str!"

下面的也是勉强处理稍大一点

@echo off&setlocal enabledelayedexpansion
set/a n=2673
for /l %%i in (1 1 !n!) do (
set/a m+=1,t=m%%3
if !t! neq 0 set str=!str! %%i
)
call :lp "!str!"
echo 最后剩下的是原来的 !str! 号
pause&exit
:lp
set "str="
for %%i in (%~1) do (
set/a m+=1,t=m%%3
if !t! neq 0 set str=!str! %%i&set/a p+=1
)
if !p! gtr 1 set p=&call:lp "!str!"
简单!简单!再简单!
15 发表于 2008-07-08 22:51 ·  中国 湖南 娄底 电信
银牌会员
★★★
积分 2,268
发帖 879
注册 2006-12-19 16:23
UID 73968
性别 男
状态 离线
大数字不行的原因是 超出了变量的最大字符数。
看谁有心思挑战这个难关。。。
致精致简!
论坛跳转: