[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] 问第100个服务员走进后有哪几扇门是开着的批处理试题[1]

某旅馆有100个房间,以1100编号,第一个服务员来了,他将所有的房门都打开,第二个服务员再把所有编号是2的倍数的房门都关上,第三个服务员对编号是3的倍数的房门原来开的关上,原来关上的打开,此后的第四,五...服务员均照此办理。问第100个服务员走进后,有哪几扇门是开着的。

[ 本帖最后由 curious 于 2009-6-6 20:38 编辑 ]

回复 8楼 的帖子

http://bbs.bathome.net/viewthrea ... amp;page=2#pid30871
为了充分保证效率千万不要使用下面两个命令
call echo.....
call set a=...
万不得已要call set n=数字
一定要call set/a n=数字    //这个效率还是很高的是set/a 一半的效率
我发现call set a=... 的执行效率比call子过程还要低10倍以上!

看来有点意思。
set、set /a、call、变量延迟,组合不同时,效率也有很大的不同。
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

直接输出平方数。。。行不行

TOP

再看这个,快了好多。
没想到                      set /a V%%b=L!V%%b!
的速度比不上:        for %%c in (!V%%b!) do set V%%b=!%%c!
  1. @echo off&setlocal enabledelayedexpansion
  2. set /p m=输入一个数:
  3. set tim=!time!
  4. set 开=关
  5. set 关=开
  6. for /l %%a in (1 1 !m!) do (set v%%a=开)
  7. for /l %%a in (2 1 !m!) do (
  8.     for /l %%b in (%%a,%%a,!m!) do (
  9.         for %%c in (!V%%b!) do set V%%b=!%%c!
  10.     )
  11. )
  12. set n=0
  13. echo 开着的门编号为:
  14. for /l %%a in (1 1 !m!) do (
  15.     if !V%%a! equ 开 (set str=!str! %%a<NUL&SET n+="1)
  16. )
  17. echo !str!
  18. echo 共 !n! 个
  19. pause
复制代码
1

评分人数

TOP

to:随风

随风兄写代码之前,最好把思路也带上,以方便象我这样的初学者!

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set /p m=输入一个数:
  3. set /a L1=0,L0=1
  4. for /l %%a in (1 1 !m!) do (set V%%a=1)
  5. for /l %%a in (2 1 !m!) do (
  6.     for /l %%b in (%%a,%%a,!m!) do (
  7.         set/a V%%b=L!V%%b!
  8.     )
  9. )
  10. set n=0
  11. set /p= 开着的门编号为:<nul
  12. for /l %%a in (1 1 !m!) do (
  13.     if !V%%a! equ 1 (set/p=%%a <nul&set/a n+=1)
  14. )
  15. echo,&echo,共 !n! 个
  16. pause
复制代码

TOP

try

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. ::第一个服务员打开所有窗户,打开为1,关上为0
  4. for /l %%i in (1,1,100) do (
  5. set /a _%%i=1
  6. )
  7. ::第二人关编号为2的倍数之窗。第三人操作编号为3的倍数之窗,开的关,关的开...
  8. for /l %%i in (2,1,100) do (
  9.   set /a n=100 / %%i
  10.   for /l %%j in (1,1,!n!) do (
  11.   set /a c=%%i*%%j
  12.   call set b=%%_!c!%%
  13.   if !b! equ 1 (set /a _!c!=0) else set /a _!c!=1
  14.   )
  15. )
  16. ::符合条件输出
  17. for /l %%i in (1,1,100) do (
  18. if !_%%i! equ 1 (
  19. set /a num+=1
  20. echo %%i
  21. )
  22. )
  23. echo !num!个窗打开的
  24. pause>nul
复制代码

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set /a m=100,r=100
  3. for /l %%a in (1 2 !m!) do (
  4.    set /a x=%%a+1
  5.    set /a .m%%a=1,.m!x!=0
  6. )
  7. for /l %%a in (3 1 !r!) do (
  8.    for /l %%b in (%%a %%a !m!) do set /a .m%%b="^!(!.m%%b!)"
  9. )
  10. for /f "tokens=1,2 delims=.m=" %%a in ('set .') do (
  11.    if %%b equ 1 echo 开着的门编号为: %%a&set /a hj+=1
  12. )
  13. echo,&echo,共 !hj! 个
  14. pause
复制代码
技术问题请到论坛发帖求助!

TOP

为何是10个?第100个人还没有开关门吧?

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%i in (1 1 100) do set /a .%%i=0
  4. for /l %%i in (1 1 99) do (
  5.     for /l %%j in (1 1 100) do (
  6.         set /a mod=%%j%%%%i
  7.         if !mod! equ 0 set /a .%%j=~!.%%j!
  8.     )
  9. )
  10. for /l %%i in (1 1 100) do (
  11.     if not !.%%i! equ 0 set /a num+=1
  12. )
  13. echo !num!
  14. pause
复制代码
我做的结果是1 4 9 16 25 36 49 64 81
一共9扇门
不知对否?
1

评分人数

TOP

返回列表