找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 36799|回复: 12

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

[复制链接]
发表于 2009-6-22 18:17:31 | 显示全部楼层 |阅读模式
斐波那契数列指的是这样一个数列: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

如何用批处理来实现求出任意指定位置的数值呢?
发表于 2009-6-22 18:27:13 | 显示全部楼层
是道有意思的题目,大家都可以来练练手了,先给出本人的解如下:
  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
复制代码
发表于 2009-6-22 18:38:08 | 显示全部楼层
印象中斐波那契数列是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 编辑 ]
发表于 2009-6-22 18:53:32 | 显示全部楼层

好像最多只能到第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%
复制代码
发表于 2009-6-22 21:06:25 | 显示全部楼层

我这边只到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
复制代码
发表于 2009-7-29 14:53:21 | 显示全部楼层
原帖由 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
发表于 2009-7-29 14:55:52 | 显示全部楼层
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
发表于 2009-7-29 15:30:01 | 显示全部楼层
哦,那个“兔子问题”,呵呵
发表于 2009-7-29 16:32:15 | 显示全部楼层
只能到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
复制代码
发表于 2009-8-25 14:37:47 | 显示全部楼层

  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 编辑 ]

评分

参与人数 1PB +1 收起 理由
Taurus + 1 讚~

查看全部评分

发表于 2009-8-27 21:22:37 | 显示全部楼层
多數位的,用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 编辑 ]
发表于 2009-11-16 06:19:19 | 显示全部楼层
纯思路,只想避过两值相加的固态,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 编辑 ]
发表于 2016-4-10 22:52:50 | 显示全部楼层

  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. )
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 21:28 , Processed in 0.025125 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表