标题: 【练习-041】批处理平分时钟数字 [打印本页]
作者: batman 时间: 2009-4-9 00:06 标题: 【练习-041】批处理平分时钟数字
&&有一道小学三年级数学题如下:
用一根过钟心的直线将时钟钟面平分为两半,要求平分的两面上的时钟数字和相等。
现在我要求大家用批处理来解这首题,列出平分后两边的两组钟面数字(提示数字为1-12)。
满分10分,视代码具体情况加分(以思路为重)。
[ 本帖最后由 batman 于 2009-4-10 11:55 编辑 ]
作者: lhjoanna 时间: 2009-4-9 00:33
思路一般,事先考虑好各组存在的位置。也适用于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%
- pause
复制代码
作者: Batcher 时间: 2009-4-9 09:07
我觉得这个题目的描述可能有点问题,昨晚在你公布答案之前,我根本没有搞懂它到底是在问什么(也许是我理解能力有限)。
作者: AnyName 时间: 2009-4-9 18:54
新手,参考了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
- pause
复制代码
[ 本帖最后由 AnyName 于 2009-4-9 18:59 编辑 ]
作者: BBCC 时间: 2009-4-9 19:32
将钟面分开然后将各部分数字相加?
暴力之~
作者: tireless 时间: 2009-4-10 11:32
- @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 & exit
复制代码
[ 本帖最后由 tireless 于 2009-4-10 13:48 编辑 ]
作者: batman 时间: 2009-4-13 11:35
楼上6个for啊,是不是在效率上考虑欠妥了。。。
作者: batman 时间: 2009-4-13 12:27
在解本题时二楼和四楼都是使用的纯数学法,思路确是好的,但不是用批处理技巧来解
决的。小学三年级学生也根本想到以上所述的这两种方法,他们所用的方法就是一组一
组六个数字相加的方法,当然这用手工来做是个笨方法,但用批就不一样了,本人的代
码如下:- @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
- )
- )
复制代码
作者: tireless 时间: 2009-4-13 15:31
- @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=%%
复制代码
作者: tyc 时间: 2009-4-14 17:55 标题: 我稳扎稳打的笨办法做出来的
- @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>nul
复制代码
作者: keen 时间: 2009-4-16 16:49
9楼的太帅了,加个分!
作者: Taurus 时间: 2010-1-2 11:53
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 编辑 ]
作者: qzwqzw 时间: 2010-1-2 15:02
另贴一组变态解法
充分体现简单问题复杂化的解题精神
其实按照小学生的解题思路
因为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% =%%
复制代码
作者: neorobin 时间: 2010-1-4 00:42
- ::我来做一个算术推理解法:
- ::假设分割线已找出, 在包含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
- pause
复制代码
[ 本帖最后由 neorobin 于 2010-1-4 00:53 编辑 ]
作者: Taurus 时间: 2010-1-4 09:58
原帖由 neorobin 于 2010-1-4 00:42 发表
::我来做一个算术推理解法:
::假设分割线已找出, 在包含12点的一侧, 设其中的6个点按顺时针方向相邻分布分别为 g,h,i,j,k,l,
::且其中顺时针方向在12后面的点都加上12, 即1点算作13点, 2点算作14点, 依此类推, 不 ...
这个真够简洁,一条算式完题了,一个loop也没有...
作者: qzwqzw 时间: 2010-1-5 11:24
扩展一下
任意一个n能被4整除的等差数列都可以平分
比如6,7,8,9,10,11,12,13
有兴趣的可以出一个通用解法
作者: a590687 时间: 2010-1-9 11:03
方法是 将表上所有数字之和除2 算出一半数字之和
再从1开始加6个数.如果和等于表上一半数字之和 就输出这6个数- @echo off&setlocal enabledelayedexpansion
- for /l %%i in (1 1 12) do (
- set /a a+=%%i
- )
- set /a n=%a%/2
- :lp
- for /l %%j in (1 1 6) do (
- set /a b+=1
- set c=!b!
- for /l %%k in (1 1 6) do (
- set /a c+=1
- set /a d+=!c!
- if !d! equ %n% (goto ak)
- )
- )
- :ak
- set /a num=!b!+1
- echo. 应切分为:
- for /l %%l in (1 1 6) do (
- set /a num+=1
- echo !num!
- )
- pause
复制代码
- ::这是随机取值版本.比较费时间
- @echo off&setlocal enabledelayedexpansion
- set/a a=(1+12)*12/4/3
- :lp
- set/a b=%random%%%12+1
- set/a c=%random%%%12+1
- set/a d=%b%+%c%
- set/a e=%b%-%c%
- if %d% equ %a% (
- if %e% equ 5 (goto end) else goto lp
- ) else goto lp
- :end
- echo.应切分为:
- set/p=!c!<nul
- for /l %%i in (1 1 5) do (
- set/a f=%c%+%%i
- set/p=!f!<nul
- )
- pause
复制代码
- ::这个是取差值版本
- @echo off&setlocal enabledelayedexpansion
- set/a a=(1+12)*12/4/3
- :lp
- for /l %%i in (1 1 12) do (
- set/a b=%%i+5
- set/a c=!b!+%%i
- if !c! equ !a! (goto end)
- )
- :end
- echo.应切分为:
- echo !b!
- for /l %%j in (1 1 5) do (
- set/a b-=1
- echo !b!
- )
- pause
复制代码
[ 本帖最后由 a590687 于 2010-1-9 14:47 编辑 ]
作者: batman 时间: 2010-1-9 12:21
我再来一个:- @echo off&setlocal enabledelayedexpansion
- set "str= #1 #2 #3 #4 #5 #6 #7 #8 #9 10 11 12 #1 #2 #3 #4 #5 #6 #7 #8 #9"
- for /l %%a in (1,1,7) do (
- set /a "num=(2*%%a+5)*3"
- if !num! equ 39 (
- set /a "a=(%%a-1)*3",b="(%%a+5)*3"
- call,set "a=%%str:~!a!,18%%"&echo !a:#=!
- call,set "b=%%str:~!b!,18%%"&echo !b:#=!
- )
- )
- pause>nul
复制代码
[ 本帖最后由 batman 于 2010-1-9 12:25 编辑 ]
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |