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

【新手练习】一道批处理数学题

有一个数,他各位上数字相加的和为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次方,单独有个变量保存现在是几次方,然后每个数都算出各位和,看是否相等


拖拽代码框显示答案(自己写的,感觉不怎么好):
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set num=1
  4. set times=0
  5. :loop
  6. set /a times+=1
  7. set /a num*=2
  8. if %num% lss 0 pause&exit
  9. call :sum %num%
  10. if %t%==%times% echo %num%
  11. goto loop
  12. :sum
  13. set n=%1
  14. set t=0
  15. set ti=-1
  16. :suml
  17. set /a ti+=1
  18. if not "!n:~%ti%,1!"=="" set /a t+=!n:~%ti%,1!&goto suml
  19. goto :EOF
复制代码


[ 本帖最后由 wxcute 于 2009-5-12 12:15 编辑 ]
1

评分人数

    • wxcute: 题目很好,最好先别放答案。PB + 5

再来
  1. @echo off&setlocal enabledelayedexpansion
  2. set a=1
  3. for /l %%i in (1 1 30) do (
  4.     set /a n=%%i,a*=2,sum=0
  5.     for /l %%j in (0 1 9) do (
  6.         set var=%%j
  7.         call :lp   
  8. )
  9. if !n!==!sum! echo !a!
  10. )
  11. pause&exit/b
  12. :lp
  13. set s=!a:~%var%,1!
  14. if not defined s goto :eof
  15. set /a sum+=s
复制代码
(*^_^*)

TOP

我也来一个

我的思路跟 pusoflase 兄完全相同,还有一个最后在求和是借用namejm兄的代码。
  1. @echo off&setlocal enabledelayedexpansion
  2. set/a num=1
  3. echo 正在检测数据……
  4. for /l %%i in (1,1,30) do (
  5. set/a num*=2
  6. set str=!num!
  7. for /l %%a in (0,1,9) do set str=!str:%%a=+%%a!
  8. set/a sum=!str!
  9. if !sum!==%%i echo !num!:!str:~1!=!sum!,2的!sum!次方为!num!。
  10. )
  11. echo 检测完毕!
  12. pause>nul
复制代码

[ 本帖最后由 sjzong 于 2009-5-13 00:54 编辑 ]

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a num=1
  4. for /l %%n in (1,1,6) do (
  5. for /l %%mi in (1,1,%n%) do set /a num*=2
  6. for /l %%a in (1,1,9) do (
  7. set /a x=%num%-%%a
  8. if %x% gtr 0 for /l %%b in (1,1,9) do (
  9. set /a x-=%%b
  10. if %x% gtr 0 for /l %%c in (1,1,9) do (
  11. set /a x-=%%c
  12. if %x% gtr 0 for /l %%d in (1,1,9) do (
  13. set /a x-=%d%
  14. if %x% gtr 0 for /l %%e in (1,1,9) do (
  15. set /a x-=%%d
  16. if %x% gtr 0 if %x% lss 10 echo
  17. %%a %%b %%c %%d %%e
  18. )
  19. )
  20. )
  21. )
  22. )
  23. )
复制代码
好象这数也太多了吧   我只写了5位数的  总共有10位数的  怎么办呢
先把这些发上来  明天再改

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set num=1
  3. :start
  4. set /a sum=0,a=0,n+=1,num*=2
  5. :loop
  6. set v=!num:~%a%,1!
  7. if "%v%"=="" goto next
  8. set /a sum+=v,a+=1
  9. goto loop
  10. :next
  11. if %n% geq 30 pause &exit
  12. if %sum%==%n% echo %num%
  13. goto start
复制代码

[ 本帖最后由 keen 于 2009-5-18 23:03 编辑 ]
(*^_^*)

TOP

费了点劲才做出来的

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a n=1
  4. for /l %%i in (1,1,30) do (
  5. set /a n*=2
  6. call :count1 !n!
  7. if "%%i"=="!ss!" echo !n!
  8. )
  9. pause>nul
  10. goto :eof
  11. :count1
  12. set aa=%1
  13. set ss=0
  14. :count2
  15. if "!aa!" neq "" (
  16. set /a ss+=!aa:~0,1!
  17. set aa=!aa:~1!
  18. goto :count2 )
复制代码

[ 本帖最后由 irresolute 于 2009-2-22 13:05 编辑 ]
1

评分人数

TOP

  1. @echo off
  2. set/a 数=1,幂=0
  3. :lp
  4. set/a 和=0,l=0
  5. :add
  6. call set i=%%数:~%l%,1%%
  7. if not "%i%"=="" set/a 和+=i,l+=1 & goto:add
  8. echo 2^^%幂%=%数% ^(%和%^)
  9. if %幂%==%和% echo 找到!
  10. set/a 数=数^<^<1,幂+=1
  11. if /i %数% gtr 0 goto:lp
  12. pause
复制代码

[ 本帖最后由 dishuo 于 2009-2-4 14:40 编辑 ]
1

评分人数

高手=发现问题^分析问题^解决问题

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set q=1
  4. for /l %%i in (1,1,30) do (
  5. set/a q=!q!*2
  6. set %%i=!q!
  7. )
  8. :re
  9. set h=0
  10. set/a a+=1
  11. set b=%a%
  12. :sum
  13. set/a h=%h%+%b:~0,1%
  14. set b=%b:~1%
  15. if not "%b%"=="" goto sum
  16. if not !%h%!==%a% goto re
  17. echo %a%
  18. pause
复制代码
1

评分人数

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a abc=1
  4. for /L %%i IN (1,1,30) DO (
  5. set /a abc*=2
  6. set a=!abc:~0,1!
  7. set b=!abc:~1,1!
  8. if "!b!"=="" set b=0
  9. set c=!abc:~2,1!
  10. if "!c!"=="" set c=0
  11. set d=!abc:~3,1!
  12. if "!d!"=="" set d=0
  13. set e=!abc:~4,1!
  14. if "!e!"=="" set e=0
  15. set f=!abc:~5,1!
  16. if "!f!"=="" set f=0
  17. set g=!abc:~6,1!
  18. if "!g!"=="" set g=0
  19. set h=!abc:~7,1!
  20. if "!h!"=="" set h=0
  21. set j=!abc:~8,1!
  22. if "!j!"=="" set j=0
  23. set k=!abc:~9,1!
  24. if "!k!"=="" set k=0
  25. set /a local=!a!+!b!+!c!+!d!+!e!+!f!+!g!+!h!+!j!+!k!
  26. if !local! EQU %%i (echo %%i OK) ELSE (echo %%i Bad)
  27. )
  28. pause
复制代码
太麻烦了,谁给简化一下?

[ 本帖最后由 denev2004 于 2009-2-3 17:45 编辑 ]
1

评分人数

setlocal enabledelayedexpansion

TOP

凑热闹~
  1. @echo Off & setlocal EnableDelayedExpansion
  2. set /a n = 1
  3. For /L %%a in (1 1 30) do (
  4.        set /a n "<<" = 1, y=0, m=n
  5.        Call :Recur %%a && (Echo 2 ^^^^ %%a = !n!& Pause & Exit /b)
  6. )
  7. :Recur
  8. If defined m (
  9.     set /a y+=%m:~,1%
  10.     set m=%m:~1%
  11.     goto :Recur
  12. )
  13. If %y% equ %1 (exit /b 0) else (exit /b 1)
复制代码

  1. @echo off & setlocal enableDelayedExpansion
  2. set /a n= 1
  3. For /l %%a in (1 1 30) do (
  4.        set /a n "<<" = 1, m=n
  5.        For /l %%d in (0 1 9) do set "m=!m:%%d=%%d+!"
  6.        set /a x=!m:~,-1!
  7.        If !x! equ %%a echo 2 ^^^^ %%a = !n!
  8. )
  9. Pause
复制代码

[ 本帖最后由 pusofalse 于 2009-1-25 01:46 编辑 ]
心绪平和,眼藏静谧。

TOP

怎么发贴啊

怎么发贴啊
怎么发贴啊
怎么发贴啊
怎么发贴啊
怎么发贴啊
怎么发贴啊
怎么发贴啊
v
1

评分人数

    • wxcute: 恶意灌水。 如何发帖请看,并注意有无发帖 ...PB -5

TOP

呵呵

不用给我加分的,只是没事贴个代码。

TOP

LS的首先循环了一次算出最大值,再循环来判断符合,感觉有点浪费
可以利用CMD的特性:超过最大值后值为变负来处理,这样只用了一次循环

TOP

  1. @echo off
  2. setlocal enableDelayedExpansion
  3. set/a num=1,Max=1
  4. for /l %%i in (1 1 30) do set/a Max*=2
  5. :next
  6. set/a n=0,rst=1
  7. set/a "num<<=1"
  8. for /l %%i in (0 1 9) do set/a n+=!num:~%%i,1! 2>nul
  9. for /l %%i in (1 1 %n%) do set/a rst*=2
  10. if %num%==%rst% echo %num% 是这种数。
  11. if %num% lss %Max% goto :next
  12. pause
复制代码
1

评分人数

TOP

返回列表