标题: 【新手练习】一道批处理数学题 [打印本页]
作者: defanive 时间: 2009-1-24 14:13 标题: 【新手练习】一道批处理数学题
有一个数,他各位上数字相加的和为n(例如250,各位上数字和就为2+5+0=7),恰好这个数等于2的n次方(连续n个2相乘),请在批处理的计算范围内求出这个数并显示出来(可能有多个答案)
一个数:abc
表达式:n = a + b + c
abc = 2 ^ n(即 2 的 n 次方)
思路:批处理的计算范围到2^31-1,数字非常打,不可能一个一个数去试。但是注意到这个数是2的n次方,n>0且n<31的整数,只有30个,这样效率会高很多。
首先从2的1次方一直试到2的30次方,单独有个变量保存现在是几次方,然后每个数都算出各位和,看是否相等
拖拽代码框显示答案(自己写的,感觉不怎么好):
- @echo off
- setlocal enabledelayedexpansion
- set num=1
- set times=0
- :loop
- set /a times+=1
- set /a num*=2
- if %num% lss 0 pause&exit
- call :sum %num%
- if %t%==%times% echo %num%
- goto loop
- :sum
- set n=%1
- set t=0
- set ti=-1
- :suml
- set /a ti+=1
- if not "!n:~%ti%,1!"=="" set /a t+=!n:~%ti%,1!&goto suml
- goto :EOF
复制代码
[ 本帖最后由 wxcute 于 2009-5-12 12:15 编辑 ]
作者: wxcute 时间: 2009-1-24 15:06
- @echo off
- setlocal enableDelayedExpansion
- set/a num=1,Max=1
- for /l %%i in (1 1 30) do set/a Max*=2
- :next
- set/a n=0,rst=1
- set/a "num<<=1"
- for /l %%i in (0 1 9) do set/a n+=!num:~%%i,1! 2>nul
- for /l %%i in (1 1 %n%) do set/a rst*=2
- if %num%==%rst% echo %num% 是这种数。
- if %num% lss %Max% goto :next
- pause
复制代码
作者: defanive 时间: 2009-1-24 15:24
LS的首先循环了一次算出最大值,再循环来判断符合,感觉有点浪费
可以利用CMD的特性:超过最大值后值为变负来处理,这样只用了一次循环
作者: wxcute 时间: 2009-1-24 15:40 标题: 呵呵
不用给我加分的,只是没事贴个代码。
作者: chongzhen123 时间: 2009-1-24 17:08 标题: 怎么发贴啊
怎么发贴啊
怎么发贴啊
怎么发贴啊
怎么发贴啊
怎么发贴啊
怎么发贴啊
怎么发贴啊
v
作者: pusofalse 时间: 2009-1-25 01:27
凑热闹~- @echo Off & setlocal EnableDelayedExpansion
- set /a n = 1
- For /L %%a in (1 1 30) do (
- set /a n "<<" = 1, y=0, m=n
- Call :Recur %%a && (Echo 2 ^^^^ %%a = !n!& Pause & Exit /b)
- )
- :Recur
- If defined m (
- set /a y+=%m:~,1%
- set m=%m:~1%
- goto :Recur
- )
- If %y% equ %1 (exit /b 0) else (exit /b 1)
复制代码
- @echo off & setlocal enableDelayedExpansion
- set /a n= 1
- For /l %%a in (1 1 30) do (
- set /a n "<<" = 1, m=n
- For /l %%d in (0 1 9) do set "m=!m:%%d=%%d+!"
- set /a x=!m:~,-1!
- If !x! equ %%a echo 2 ^^^^ %%a = !n!
- )
- Pause
复制代码
[ 本帖最后由 pusofalse 于 2009-1-25 01:46 编辑 ]
作者: denev2004 时间: 2009-2-3 17:36
- @echo off
- setlocal enabledelayedexpansion
- set /a abc=1
-
- for /L %%i IN (1,1,30) DO (
- set /a abc*=2
- set a=!abc:~0,1!
- set b=!abc:~1,1!
- if "!b!"=="" set b=0
- set c=!abc:~2,1!
- if "!c!"=="" set c=0
- set d=!abc:~3,1!
- if "!d!"=="" set d=0
- set e=!abc:~4,1!
- if "!e!"=="" set e=0
- set f=!abc:~5,1!
- if "!f!"=="" set f=0
- set g=!abc:~6,1!
- if "!g!"=="" set g=0
- set h=!abc:~7,1!
- if "!h!"=="" set h=0
- set j=!abc:~8,1!
- if "!j!"=="" set j=0
- set k=!abc:~9,1!
- if "!k!"=="" set k=0
- set /a local=!a!+!b!+!c!+!d!+!e!+!f!+!g!+!h!+!j!+!k!
- if !local! EQU %%i (echo %%i OK) ELSE (echo %%i Bad)
- )
- pause
复制代码
太麻烦了,谁给简化一下?
[ 本帖最后由 denev2004 于 2009-2-3 17:45 编辑 ]
作者: mkl 时间: 2009-2-3 22:54
- @echo off
- setlocal enabledelayedexpansion
- set q=1
- for /l %%i in (1,1,30) do (
- set/a q=!q!*2
- set %%i=!q!
- )
- :re
- set h=0
- set/a a+=1
- set b=%a%
- :sum
- set/a h=%h%+%b:~0,1%
- set b=%b:~1%
- if not "%b%"=="" goto sum
- if not !%h%!==%a% goto re
- echo %a%
- pause
复制代码
作者: dishuo 时间: 2009-2-4 14:36
- @echo off
- set/a 数=1,幂=0
- :lp
- set/a 和=0,l=0
- :add
- call set i=%%数:~%l%,1%%
- if not "%i%"=="" set/a 和+=i,l+=1 & goto:add
- echo 2^^%幂%=%数% ^(%和%^)
- if %幂%==%和% echo 找到!
- set/a 数=数^<^<1,幂+=1
- if /i %数% gtr 0 goto:lp
- pause
复制代码
[ 本帖最后由 dishuo 于 2009-2-4 14:40 编辑 ]
作者: irresolute 时间: 2009-2-22 13:03 标题: 费了点劲才做出来的
- @echo off
- setlocal enabledelayedexpansion
- set /a n=1
- for /l %%i in (1,1,30) do (
- set /a n*=2
- call :count1 !n!
- if "%%i"=="!ss!" echo !n!
- )
- pause>nul
- goto :eof
-
- :count1
- set aa=%1
- set ss=0
- :count2
- if "!aa!" neq "" (
- set /a ss+=!aa:~0,1!
- set aa=!aa:~1!
- goto :count2 )
复制代码
[ 本帖最后由 irresolute 于 2009-2-22 13:05 编辑 ]
作者: keen 时间: 2009-3-18 14:42
- @echo off&setlocal enabledelayedexpansion
- set num=1
- :start
- set /a sum=0,a=0,n+=1,num*=2
- :loop
- set v=!num:~%a%,1!
- if "%v%"=="" goto next
- set /a sum+=v,a+=1
- goto loop
- :next
- if %n% geq 30 pause &exit
- if %sum%==%n% echo %num%
- goto start
复制代码
[ 本帖最后由 keen 于 2009-5-18 23:03 编辑 ]
作者: stuqx 时间: 2009-3-20 23:30
- @echo off
- setlocal enabledelayedexpansion
- set /a num=1
- for /l %%n in (1,1,6) do (
- for /l %%mi in (1,1,%n%) do set /a num*=2
- for /l %%a in (1,1,9) do (
- set /a x=%num%-%%a
- if %x% gtr 0 for /l %%b in (1,1,9) do (
- set /a x-=%%b
- if %x% gtr 0 for /l %%c in (1,1,9) do (
- set /a x-=%%c
- if %x% gtr 0 for /l %%d in (1,1,9) do (
- set /a x-=%d%
- if %x% gtr 0 for /l %%e in (1,1,9) do (
- set /a x-=%%d
- if %x% gtr 0 if %x% lss 10 echo
- %%a %%b %%c %%d %%e
- )
- )
- )
- )
- )
- )
复制代码
好象这数也太多了吧 我只写了5位数的 总共有10位数的 怎么办呢
先把这些发上来 明天再改
作者: sjzong 时间: 2009-5-13 00:44 标题: 我也来一个
我的思路跟 pusoflase 兄完全相同,还有一个最后在求和是借用namejm兄的代码。- @echo off&setlocal enabledelayedexpansion
- set/a num=1
- echo 正在检测数据……
- for /l %%i in (1,1,30) do (
- set/a num*=2
- set str=!num!
- for /l %%a in (0,1,9) do set str=!str:%%a=+%%a!
- set/a sum=!str!
- if !sum!==%%i echo !num!:!str:~1!=!sum!,2的!sum!次方为!num!。
- )
- echo 检测完毕!
- pause>nul
复制代码
[ 本帖最后由 sjzong 于 2009-5-13 00:54 编辑 ]
作者: keen 时间: 2009-5-18 23:34
再来- @echo off&setlocal enabledelayedexpansion
- set a=1
- for /l %%i in (1 1 30) do (
- set /a n=%%i,a*=2,sum=0
- for /l %%j in (0 1 9) do (
- set var=%%j
- call :lp
- )
- if !n!==!sum! echo !a!
- )
- pause&exit/b
-
- :lp
- set s=!a:~%var%,1!
- if not defined s goto :eof
- set /a sum+=s
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |