标题: [已结]一道题
[打印本页]
作者: pusofalse
时间: 2008-7-8 10:57
标题: [已结]一道题
有过这样一道题,某位朋友从C题目中选出来的。。但当时讨论时这题没有给出答案。
今天忽然想起来,发上来一起做做。。。
n个人围成1圈,顺序排号,从1到3开始报数,报到3的人退出这个圈子,问最后留下的那个人是原来的几号?
[
Last edited by pusofalse on 2008-7-8 at 12:51 PM ]
作者: 26933062
时间: 2008-7-8 11:11
是n个人吗?没有具体的人数?
作者: pusofalse
时间: 2008-7-8 11:13
n 是用户输入的数字
作者: 26933062
时间: 2008-7-8 11:19
仍不太明白题意
假设有 a b c d e f g h 8人
当数到3时,c 退出,然后该如何?又从1开始数起吗?若是,是从a开始数还是从d开始数?
作者: pusofalse
时间: 2008-7-8 11:24
数到3,c退出,然后接着从d开始数1,那么轮到f数到3,f退出。g接着数1,h是2,然后接着返回a,a又退出。第二次循环时b是1,d又推出。如此循环,直到只剩一个人,问这个人是原来的几号。。。
作者: 26933062
时间: 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!) 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 ]
作者: pusofalse
时间: 2008-7-8 12:01
有8个人时,留下的是原来的8号,而不是7号。
作者: 26933062
时间: 2008-7-8 12:21
怎么会呢?
我手工数 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
作者: pusofalse
时间: 2008-7-8 12:23
我写了一通,发现和前辈的竟然运行结果都一样。。。完全一样。。。
@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 ]
作者: 26933062
时间: 2008-7-8 12:27
看了 8 楼 的回帖了吗?
作者: pusofalse
时间: 2008-7-8 12:35
SORRY
是我错了。。。
疏漏了一个。。。
[
Last edited by pusofalse on 2008-7-8 at 12:39 PM ]
作者: radem
时间: 2008-7-8 13:10
1 2
3 4 5
6 7 8
1 2 4
5 7 8
2 4 7
8
4 7
7
作者: HAT
时间: 2008-7-8 14:06
著名的约瑟夫环问题
作者: terse
时间: 2008-7-8 22:08
Quote: |
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!"
作者: 26933062
时间: 2008-7-8 22:51
大数字不行的原因是 超出了变量的最大字符数。
看谁有心思挑战这个难关。。。
作者: pusofalse
时间: 2008-7-8 23:17
果真有最大字符数啊。。。
有确切的上限吗?
作者: 26933062
时间: 2008-7-8 23:26
好像是8千多个,具体的记不清了,自己测试吧。。
作者: pusofalse
时间: 2008-7-8 23:38
测试最多是8186个字符
作者: terse
时间: 2008-7-9 01:07
效率实在是......
@echo off&setlocal enabledelayedexpansion
set/a n=5000
set s=1
:lp
set str=&set p=
for /l %%i in (!s! 1 !n!) do (
if not defined %%i (
set/a m+=1,t=m%%3
if !t! equ 0 (set %%i=%%i) else (
if not defined p set s=%%i
set str=!str! %%i&set/a p+=1&set u=%%i
)))
if !p! gtr 1 set n=!u!&goto lp
echo 最后剩下的是原来的 !str! 号
pause
作者: huahua0919
时间: 2008-7-9 12:09
我也写了个,支持3位以上多位输入
@echo off
set /p a=please input data:
set b=%a%
:lp1
set /a n+=1&set a=%a:~1%
if defined a goto :lp1
:lp2
set/a n-=1&set loop1=%b:~0,2%&set loop2=%b:~3%
set b=%loop2%%loop1%
if %n% equ 3 (echo the last number is: %b:~1,1%) else (goto :lp2)
pause