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

[数值计算] 求斐波那契数列(Fibonacci)的批处理

斐波那契数列指的是这样一个数列:1、1、2、3、5、8、13、21、34、55……
既:从第三位开始,它的数值等于前两位之和,用数学表达式表示:
f(x)=1 0<x<3
f(x)=f(x-1)+f(x-2) x>=3

如何用批处理来实现求出任意指定位置的数值呢?

  1. @echo off&setlocal enabledelayedexpansion
  2. mode con cols=100 lines=25
  3. set "Fa[1]=00000001"
  4. set "Fb[1]=00000001"
  5. for /l %%i in (2 1 125) do (
  6. set "Fa[%%i]=00000000"
  7. set "Fb[%%i]=00000000"
  8. )
  9. for /l %%n in (3 1 5000) do (
  10. set add=0&set "F="
  11. set/a CYC=%%n/5+8
  12. for /l %%i in (1 1 !CYC!) do (
  13. set/a Fn[%%i]=1!Fa[%%i]!+1!Fb[%%i]!
  14. set/a tmp=Fn[%%i]+add
  15. set Fa[%%i]=!Fb[%%i]!
  16. set Fb[%%i]=!tmp:~1!
  17. if not "!Fb[%%i]!"=="00000000" (set F=!Fb[%%i]!!F!)
  18. if !tmp! geq 300000000 (set add=1) else (set add=0)
  19. )
  20. for /l %%l in (1 1 7) do (
  21. if "!F:~0,1!"=="0" (set F=!F:~1!)
  22. )
  23. echo !F!
  24. )
复制代码

TOP

纯思路,只想避过两值相加的固态,CLng到47位还是会溢位)
bat实现较麻烦,用了vbs
do
str = (digital-3)
a=0
if str > -3 then
a=1
For i = 0 To str
num=a*1.6180339887
a=CLng(num)
Next
end if
digital=InputBox("Num = "& a,"Fibonacci sequence","0")
if digital="" then
exit do
end if
loop

[ 本帖最后由 Taurus 于 2009-11-16 06:29 编辑 ]
带内地用语或带里语的文章,在下读写总觉有点吃力;
如误解了各位意思的讲勿见怪   ^_^

TOP

多數位的,用vbs引擎做計算部份
'>nul 2>nul&echo off&title Taurus's Fibonacci Testscript
':batloop
'>nul 2>nul&cls
'>nul 2>nul&set/p NUM=In digital *
'>nul 2>nul&for /f "delims=#" %%i  in ('call CScript.EXE ""%0"" //Nologo //e:VBScript %NUM%') Do Set Var=%%i
'>nul 2>nul&cls
'>nul 2>nul&echo %NUM% = %Var%
'>nul 2>nul&pause>nul
'>nul 2>nul&goto :batloop
str = (WScript.Arguments(0)-1)
a=0
b=1
For i = 0 To str
c=a
a=a+b
b=c
Next
WScript.echo (a)

[ 本帖最后由 Taurus 于 2009-8-27 21:54 编辑 ]
带内地用语或带里语的文章,在下读写总觉有点吃力;
如误解了各位意思的讲勿见怪   ^_^

TOP

  1. @echo off
  2. echo 批处理计算雯波那契数列,按任意键查看下一个。
  3. setlocal enabledelayedexpansion
  4. set a=1
  5. set b=1
  6. echo 第1项为:!a!
  7. echo 第2项为:!b!
  8. :start
  9. set /a tn+=1
  10. set /a n_=!tn!+2
  11. for /l %%a in (1,1,1000) do (
  12.       set ka=!a:~%%a,1!
  13.       if not defined ka (
  14.             set la=%%a
  15.             goto :start_a
  16.       )
  17. )
  18. :start_a
  19. for /l %%a in (1,1,1000) do (
  20.       set kb=!b:~%%a,1!
  21.       if not defined kb (
  22.             set lb=%%a
  23.             goto :start_b
  24.       )
  25. )
  26. :start_b
  27. if !la! == !lb! (
  28.       set l=!la!
  29.       set /a m=!a:~0,1!+!b:~0,1!
  30.       if !m! geq 9 (
  31.             set n=1
  32.             ) else (
  33.             set n=0
  34.       )
  35.       ) else (
  36.       set n=0
  37. )
  38. if !la! gtr !lb! (
  39.       set /a l=!la!+!n!
  40.       ) else (
  41.       set /a l=!lb!+!n!
  42. )
  43. for /l %%a in (1,1,!l!) do (
  44.       if !la! geq %%a (
  45.             set x=!a:~-%%a,1!
  46.             ) else (
  47.             set x=0
  48.       )
  49.       if !lb! geq %%a (
  50.             set y=!b:~-%%a,1!
  51.             ) else (
  52.             set y=0
  53.       )
  54.       if defined o (
  55.             set /a z=!x!+!y!+!o!
  56.             set o=
  57.             ) else (
  58.             set /a z=!x!+!y!
  59.       )
  60.       if !z! gtr 9 set o=1
  61.       set /p =!z:~-1,1!<nul>>%temp%\temp.txt
  62.       set /p all=<%temp%\temp.txt
  63. )
  64. for /l %%a in (1,1,!l!) do set /p =!all:~-%%a,1!<nul>>%temp%\temp_.txt
  65. set b=!a!
  66. set /p a=<%temp%\temp_.txt
  67. del %temp%\temp*.txt /q
  68. if "!a:~0,1!" == "0" set a=!a:~1!
  69. echo 第!n_!项为:!a!
  70. pause>nul
  71. goto :start
复制代码

[ 本帖最后由 lxzzr 于 2009-8-25 14:38 编辑 ]
1

评分人数

TOP

只能到46位....
  1. @echo off
  2. set a=1
  3. set b=1
  4. :start
  5. set /a n+=1
  6. set /a p=%n%+2
  7. set /a c=%a%+%b%
  8. set b=%a%
  9. set a=%c%
  10. echo 第%p%个为:%c%
  11. pause
  12. goto :start
复制代码

TOP

哦,那个“兔子问题”,呵呵

TOP

0 - 46位:         
@echo off&setlocal EnableDelayedExpansion
set /a a=0,b=1
set /p nub=In digital *  
for /l %%a in (1,1,%nub%) do set /a a+=!b!,b=!a!
cls&echo !nub! digital = !a!
pause>nul

TOP

原帖由 pusofalse 于 2009-6-22 18:38 发表
印象中斐波那契数列是1 2 3 5 8 13 ...这样的,第二位是2,可能是我记错了。@echo off
Set /p iStop=
Set /a iX = 1, iY = 0, iN = 0, iFlag = iStop %% 2
:loop
Set /a iX += iY, iY += iX, iN += 2
If %iN% L ...

应该由0位计;
0位是0
1位是1
2位是1
3位是2
4位是3
5位是5
6位是8
...etc

TOP

我这边只到46位,第47位就是负数了。

  1. @echo off&setlocal enabledelayedexpansion
  2. set /a a=1,b=1
  3. :lp
  4. set /a c=a+b,n+=1
  5. if %n% leq 2 (set /p=%a% <nul) else (
  6.    set /a a=!b!,b=!c!
  7.    set /p=!c! <nul
  8. )
  9. if %n% equ 46 goto end
  10. goto lp
  11. :end
  12. pause>nul
复制代码
(*^_^*)

TOP

好像最多只能到第48位

  1. @echo off
  2. set/pn=请输入要显示第几位数:
  3. set num1=1
  4. for /l %%i in (2 1 %n%) do call :Fibonacci %%i
  5. set num%n%
  6. pause
  7. goto :eof
  8. :Fibonacci
  9. set/a L=%1-1,L2=%1-2
  10. set/a num%1=num%L%+num%L2%
复制代码
批处理之家论坛官方 QQ 群 :【当前人数/人数上限】【2009-07-08】
群①:43011867(181/200);群②:(暂缺数据);群③:66165582(120/200)。

TOP

印象中斐波那契数列是1 2 3 5 8 13 ...这样的,第二位是2,可能是我记错了。
  1. @echo off
  2. Set /p iStop=
  3. Set /a iX = 1, iY = 0, iN = 0, iFlag = iStop %% 2
  4. :loop
  5. Set /a iX += iY, iY += iX, iN += 2
  6. If %iN% LSS %iStop% goto :loop
  7. If %iFlag% equ 1 (echo %iX%) else (echo %iY%)
  8. Pause
复制代码


[ 本帖最后由 pusofalse 于 2009-6-22 18:39 编辑 ]
心绪平和,眼藏静谧。

TOP

是道有意思的题目,大家都可以来练练手了,先给出本人的解如下:
  1. @echo off
  2. set /p num=请输入要计算的数列位数:
  3. if %num% leq 2 set /a ans=1&goto end
  4. set /a num-=2,ans1=1,ans2=1
  5. for /l %%a in (1,1,%num%) do set /a ans=ans1+ans2,ans1=ans2,ans2=ans
  6. :end
  7. echo 结果是:%ans%
  8. pause>nul
复制代码
***共同提高***

TOP

返回列表