Board logo

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

作者: curious    时间: 2009-6-6 20:02     标题: 问第100个服务员走进后有哪几扇门是开着的批处理试题[1]

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

[ 本帖最后由 curious 于 2009-6-6 20:38 编辑 ]
作者: lhjoanna    时间: 2009-6-6 20:22

  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扇门
不知对否?
作者: lhjoanna    时间: 2009-6-6 21:27

为何是10个?第100个人还没有开关门吧?
作者: 随风    时间: 2009-6-6 21:43

  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
复制代码

作者: curious    时间: 2009-6-6 23:57     标题: 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
复制代码

作者: netbenton    时间: 2009-6-6 23:59

  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
复制代码

作者: curious    时间: 2009-6-7 00:04     标题: to:随风

随风兄写代码之前,最好把思路也带上,以方便象我这样的初学者!
作者: netbenton    时间: 2009-6-7 01:18

再看这个,快了好多。
没想到                      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
复制代码

作者: slore    时间: 2009-6-7 02:01

直接输出平方数。。。行不行
作者: zqz0012005    时间: 2009-6-7 20:17     标题: 回复 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、变量延迟,组合不同时,效率也有很大的不同。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2