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

【练习-041】批处理平分时钟数字

&&有一道小学三年级数学题如下:
   用一根过钟心的直线将时钟钟面平分为两半,要求平分的两面上的时钟数字和相等。
   现在我要求大家用批处理来解这首题,列出平分后两边的两组钟面数字(提示数字为1-12)。
   满分10分,视代码具体情况加分(以思路为重)。

[ 本帖最后由 batman 于 2009-4-10 11:55 编辑 ]
***共同提高***

思路一般,事先考虑好各组存在的位置。也适用于24小时制时钟。
  1. @echo off&setlocal enabledelayedexpansion
  2. :begin
  3. set /p "_time=请输入时钟制:"
  4. if not "!_time!" equ "12" (
  5.    if not  "!_time!" equ "24"  goto begin
  6. )
  7. set /a a=_time/4,b=a*3
  8. for /l %%i in (1 1 %_time%) do (
  9.     if %%i leq %a% (
  10.         set "group1=!group1! %%i"
  11.     ) else if %%i leq %b% (
  12.            set "group2=!group2! %%i"
  13.     ) else set "group1=!group1! %%i"
  14. )
  15. echo group1:%group1%
  16. echo group2:%group2%
  17. pause
复制代码
1

评分人数

    • batman: 思路是好,但有局限性PB + 5

TOP

我觉得这个题目的描述可能有点问题,昨晚在你公布答案之前,我根本没有搞懂它到底是在问什么(也许是我理解能力有限)。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

新手,参考了2楼的部分代码
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a sum=(1+12)*6
  3. set /a num=(!sum!/2/3-5)/2
  4. set /a num2=num+5
  5. for /l %%i in (!num!,1,!num2!) do (
  6.         set "gp1=!gp1! %%i"
  7.         set /a var=%%i+6
  8.         if !var! GTR 12 set /a var-=12
  9.         set "gp2=!gp2! !var!"
  10.         )
  11. echo group1:!gp1!
  12. echo group2:!gp2!
  13. endlocal
  14. pause
复制代码

[ 本帖最后由 AnyName 于 2009-4-9 18:59 编辑 ]
1

评分人数

    • batman: 纯数学法,非批法PB + 5

TOP

将钟面分开然后将各部分数字相加?

暴力之~
for /f "delims=" %%a in ('%0') do (echo %%a)

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%a in (1 1 12) do set /a All+=%%a
  3. for /l %%a in (1 1 12) do (
  4.   for /l %%i in (%%a 1 12) do (
  5.     for /l %%o in (%%a 1 %%i) do set /a Two+=%%o
  6.     set /a "1/(Two*2-All)" 2>nul && set "Two=" || call :End %%a %%i
  7.   )
  8. )
  9. :End
  10. for /l %%a in (1 1 12) do set "AB=!AB!%%a "
  11. for /l %%a in (%1 1 %2) do set "A=!A!%%a "
  12. echo %A%
  13. call echo %%AB:!A!=%%
  14. pause & exit
复制代码

[ 本帖最后由 tireless 于 2009-4-10 13:48 编辑 ]

TOP

楼上6个for啊,是不是在效率上考虑欠妥了。。。
***共同提高***

TOP

在解本题时二楼和四楼都是使用的纯数学法,思路确是好的,但不是用批处理技巧来解
决的。小学三年级学生也根本想到以上所述的这两种方法,他们所用的方法就是一组一
组六个数字相加的方法,当然这用手工来做是个笨方法,但用批就不一样了,本人的代
码如下:
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=1 2 3 4 5 6 7 8 9 10 11 12"
  3. :lp
  4. for /f "tokens=1-6" %%a in ("%str%") do (
  5.     set /a num=%%a+%%b+%%c+%%d+%%e+%%f
  6.     if !num! equ 39 (
  7.        echo 第一组数为:%%a %%b %%c %%d %%e %%f
  8.        echo 第二组数为:!str:%%a %%b %%c %%d %%e %%f =!
  9.        pause>nul&goto :eof
  10.    ) else (
  11.        if %%a lss 10 (
  12.           set "str=%str:~2% %str:~,1%"
  13.           ) else (
  14.           set "str=%str:~3% %str:~,2%"
  15.        )
  16.        set /a num=0&goto lp
  17.    )
  18. )
复制代码
***共同提高***

TOP

  1. @echo off
  2. set str=1 2 3 4 5 6 7 8 9 10 11 12
  3. call :a %str%
  4. pause & exit/b
  5. :a
  6. set /a six=0,six=%1+%2+%3+%4+%5+%6
  7. if %six% neq 39 shift & goto a
  8. echo %1 %2 %3 %4 %5 %6
  9. call echo %%str: %1 %2 %3 %4 %5 %6=%%
复制代码
5

评分人数

TOP

我稳扎稳打的笨办法做出来的

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a half=(1+12)*6/2
  4. for /l %%i in (1,1,12) do (
  5. set /a a=%%i
  6. set  c=0
  7. set t1=
  8. for /l %%b in (1,1,6) do (
  9. set t1=!t1! !a!
  10. set /a c+=a
  11. set /a a+=1
  12. if !a! gtr 12 set /a a-=12
  13. )
  14. if !c! equ %half% echo !t1!
  15. )
  16. pause>nul
复制代码

TOP

9楼的太帅了,加个分!
(*^_^*)

TOP

9楼的真高,加分加分~~

在别forum看到此题,也把做好的贴到这里:
@echo off&setlocal enabledelayedexpansion
set var=1 2 3 4 5 6 7 8 9 10 11 12
:lp
for /f "tokens=1-12 delims= " %%a in ("%var%") do (
    set/a str1=%%a+%%b+%%c+%%d+%%e+%%f
    if "!str1!"=="39" set/p=%%a+%%b+%%c+%%d+%%e+%%f = %%g+%%h+%%i+%%j+%%k+%%l = !str1!&exit
)
for /f "tokens=1,* delims= " %%i in ("%var%") do set var=%%j %%i
goto :lp

[ 本帖最后由 Taurus 于 2010-1-2 12:15 编辑 ]
带内地用语或带里语的文章,在下读写总觉有点吃力;
如误解了各位意思的讲勿见怪   ^_^

TOP

另贴一组变态解法
充分体现简单问题复杂化的解题精神
其实按照小学生的解题思路
因为1-12中6,7两边的数加起来总是相等的
所以从6,7开始向两边数够3对数
也就是6,7,5,8,4,9
就可以满足解题条件了...
  1. @echo off
  2. echo.因为钟面所有数字由1-12的等差数列组成,
  3. echo.所以依据等差数列求和公式Sn=n(a1+an)/2 求得所有数字之和
  4. set /a S12=12*(1+12)/2
  5. echo.S12=12*(1+12)/2=%S12%
  6. echo.
  7. echo.因为两组数字之和相等,所以其中一组数字之和
  8. set /a S6=S12/2
  9. echo.S6=S12/2=%S6%
  10. echo.
  11. echo.因为每组数字共有6个,且必有一组为等差数列,
  12. echo.依据等差数列另一个求和公式Sn=na1+n(n-1)d/2 推得数列的起始数字
  13. set /a a1=(S6-6*(6-1)*1/2)/6
  14. echo.a1=(S6-6*(6-1)*1/2)/6=%a1%
  15. echo.
  16. echo.那么起始数字为a1的一组等差数列为:
  17. set /a a2=a1+1,a3=a1+2,a4=a1+3,a5=a1+4,a6=a1+5
  18. echo.%a1%,%a2%,%a3%,%a4%,%a5%,%a6%
  19. echo.
  20. echo.那么1-12中剩下的数字就是另外一组了
  21. set "num=1 2 3 4 5 6 7 8 9 10 11 12 "
  22. call echo.%%num:%a1% %a2% %a3% %a4% %a5% %a6% =%%
复制代码

TOP

  1. ::我来做一个算术推理解法:
  2. ::假设分割线已找出, 在包含12点的一侧, 设其中的6个点按顺时针方向相邻分布分别为 g,h,i,j,k,l,  
  3. ::且其中顺时针方向在12后面的点都加上12, 即1点算作13点, 2点算作14点, 依此类推, 不含12点
  4. ::的一侧全按原数计算.  显然, g,h,i,j,k,l 都比它们各自关于钟心的对称点要大6, 所以这一侧的总和
  5. ::就比另一侧的总和大出 6*6=36, 按题目要求, 两侧的总和应相等, 这个大出的 36 就是由12点
  6. ::顺时针方向后面的点数都加了 12 造成的, 所以共有 36/12=3 个点加了12, 显然就是 1,2,3,
  7. ::所以分割线穿过3点和4点之间, 解毕.
  8. @echo off
  9. (set ps= 1 2 3 4 5 6 7 8 9 10 11 12) & (set /a "s=6*6/12+1, e=s+11")
  10. for /f "tokens=%s%-%e% delims= " %%a in ("%ps%%ps%") do echo %%a+%%b+%%c+%%d+%%e+%%f=%%g+%%h+%%i+%%j+%%k+%%l
  11. pause
复制代码

[ 本帖最后由 neorobin 于 2010-1-4 00:53 编辑 ]
2

评分人数

    • qzwqzw: 不加一个对不起自己的良心啊PB + 5
    • Taurus: 三個command就K掉題目了... + 1

TOP

原帖由 neorobin 于 2010-1-4 00:42 发表
::我来做一个算术推理解法:
::假设分割线已找出, 在包含12点的一侧, 设其中的6个点按顺时针方向相邻分布分别为 g,h,i,j,k,l,  
::且其中顺时针方向在12后面的点都加上12, 即1点算作13点, 2点算作14点, 依此类推, 不 ...

这个真够简洁,一条算式完题了,一个loop也没有...
带内地用语或带里语的文章,在下读写总觉有点吃力;
如误解了各位意思的讲勿见怪   ^_^

TOP

返回列表