返回列表 发帖

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

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

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

思路一般,事先考虑好各组存在的位置。也适用于24小时制时钟。
@echo off&setlocal enabledelayedexpansion
:begin
set /p "_time=请输入时钟制:"
if not "!_time!" equ "12" (
   if not  "!_time!" equ "24"  goto begin
)
set /a a=_time/4,b=a*3
for /l %%i in (1 1 %_time%) do (
    if %%i leq %a% (
        set "group1=!group1! %%i"
    ) else if %%i leq %b% (
           set "group2=!group2! %%i"
    ) else set "group1=!group1! %%i"
)
echo group1:%group1%
echo group2:%group2%
pauseCOPY
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楼的部分代码
@echo off&setlocal enabledelayedexpansion
set /a sum=(1+12)*6
set /a num=(!sum!/2/3-5)/2
set /a num2=num+5
for /l %%i in (!num!,1,!num2!) do (
        set "gp1=!gp1! %%i"
        set /a var=%%i+6
        if !var! GTR 12 set /a var-=12
        set "gp2=!gp2! !var!"
        )
echo group1:!gp1!
echo group2:!gp2!
endlocal
pauseCOPY

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

评分人数

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

TOP

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

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

TOP

@echo off&setlocal enabledelayedexpansion
for /l %%a in (1 1 12) do set /a All+=%%a
for /l %%a in (1 1 12) do (
  for /l %%i in (%%a 1 12) do (
    for /l %%o in (%%a 1 %%i) do set /a Two+=%%o
    set /a "1/(Two*2-All)" 2>nul && set "Two=" || call :End %%a %%i
  )
)
:End
for /l %%a in (1 1 12) do set "AB=!AB!%%a "
for /l %%a in (%1 1 %2) do set "A=!A!%%a "
echo %A%
call echo %%AB:!A!=%%
pause & exitCOPY

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

TOP

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

TOP

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

TOP

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

评分人数

TOP

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

@echo off
setlocal enabledelayedexpansion
set /a half=(1+12)*6/2
for /l %%i in (1,1,12) do (
set /a a=%%i
set  c=0
set t1=
for /l %%b in (1,1,6) do (
set t1=!t1! !a!
set /a c+=a
set /a a+=1
if !a! gtr 12 set /a a-=12
)
if !c! equ %half% echo !t1!
)
pause>nulCOPY

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
就可以满足解题条件了...
@echo off
echo.因为钟面所有数字由1-12的等差数列组成,
echo.所以依据等差数列求和公式Sn=n(a1+an)/2 求得所有数字之和
set /a S12=12*(1+12)/2
echo.S12=12*(1+12)/2=%S12%
echo.
echo.因为两组数字之和相等,所以其中一组数字之和
set /a S6=S12/2
echo.S6=S12/2=%S6%
echo.
echo.因为每组数字共有6个,且必有一组为等差数列,
echo.依据等差数列另一个求和公式Sn=na1+n(n-1)d/2 推得数列的起始数字
set /a a1=(S6-6*(6-1)*1/2)/6
echo.a1=(S6-6*(6-1)*1/2)/6=%a1%
echo.
echo.那么起始数字为a1的一组等差数列为:
set /a a2=a1+1,a3=a1+2,a4=a1+3,a5=a1+4,a6=a1+5
echo.%a1%,%a2%,%a3%,%a4%,%a5%,%a6%
echo.
echo.那么1-12中剩下的数字就是另外一组了
set "num=1 2 3 4 5 6 7 8 9 10 11 12 "
call echo.%%num:%a1% %a2% %a3% %a4% %a5% %a6% =%%COPY

TOP

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

[ 本帖最后由 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

返回列表