返回列表 发帖

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

有一个数,他各位上数字相加的和为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 :EOFCOPY


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

评分人数

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

@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
pauseCOPY
1

评分人数

TOP

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

TOP

呵呵

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

TOP

怎么发贴啊

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

评分人数

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

TOP

凑热闹~
@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)COPY

@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!
)
PauseCOPY

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

TOP

@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)
)
pauseCOPY
太麻烦了,谁给简化一下?

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

评分人数

setlocal enabledelayedexpansion

TOP

@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%
pauseCOPY
1

评分人数

TOP

@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
pauseCOPY

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

评分人数

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

TOP

费了点劲才做出来的

@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 )COPY

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

评分人数

TOP

@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 startCOPY

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

TOP

@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
)
)
)
)
)
)COPY
好象这数也太多了吧   我只写了5位数的  总共有10位数的  怎么办呢
先把这些发上来  明天再改

TOP

我也来一个

我的思路跟 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>nulCOPY

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

TOP

再来
@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+=sCOPY
(*^_^*)

TOP

返回列表