标题: [数值计算] 求斐波那契数列(Fibonacci)的批处理 [打印本页]
作者: 0428_hai 时间: 2009-6-22 18:17 标题: 求斐波那契数列(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
如何用批处理来实现求出任意指定位置的数值呢?
作者: batman 时间: 2009-6-22 18:27
是道有意思的题目,大家都可以来练练手了,先给出本人的解如下:
- @echo off
- set /p num=请输入要计算的数列位数:
- if %num% leq 2 set /a ans=1&goto end
- set /a num-=2,ans1=1,ans2=1
- for /l %%a in (1,1,%num%) do set /a ans=ans1+ans2,ans1=ans2,ans2=ans
- :end
- echo 结果是:%ans%
- pause>nul
复制代码
作者: 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% LSS %iStop% goto :loop
- If %iFlag% equ 1 (echo %iX%) else (echo %iY%)
- Pause
复制代码
[ 本帖最后由 pusofalse 于 2009-6-22 18:39 编辑 ]
作者: wxcute 时间: 2009-6-22 18:53 标题: 好像最多只能到第48位
- @echo off
- set/pn=请输入要显示第几位数:
- set num1=1
- for /l %%i in (2 1 %n%) do call :Fibonacci %%i
- set num%n%
- pause
- goto :eof
- :Fibonacci
- set/a L=%1-1,L2=%1-2
- set/a num%1=num%L%+num%L2%
复制代码
作者: keen 时间: 2009-6-22 21:06 标题: 我这边只到46位,第47位就是负数了。
- @echo off&setlocal enabledelayedexpansion
- set /a a=1,b=1
- :lp
- set /a c=a+b,n+=1
- if %n% leq 2 (set /p=%a% <nul) else (
- set /a a=!b!,b=!c!
- set /p=!c! <nul
- )
- if %n% equ 46 goto end
- goto lp
- :end
- pause>nul
复制代码
作者: Taurus 时间: 2009-7-29 14:53
原帖由 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
作者: Taurus 时间: 2009-7-29 14:55
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
作者: wankoilz 时间: 2009-7-29 15:30
哦,那个“兔子问题”,呵呵
作者: lxzzr 时间: 2009-7-29 16:32
只能到46位....- @echo off
- set a=1
- set b=1
- :start
- set /a n+=1
- set /a p=%n%+2
- set /a c=%a%+%b%
- set b=%a%
- set a=%c%
- echo 第%p%个为:%c%
- pause
- goto :start
复制代码
作者: lxzzr 时间: 2009-8-25 14:37
-
- @echo off
- echo 批处理计算雯波那契数列,按任意键查看下一个。
- setlocal enabledelayedexpansion
- set a=1
- set b=1
- echo 第1项为:!a!
- echo 第2项为:!b!
- :start
- set /a tn+=1
- set /a n_=!tn!+2
- for /l %%a in (1,1,1000) do (
- set ka=!a:~%%a,1!
- if not defined ka (
- set la=%%a
- goto :start_a
- )
- )
- :start_a
- for /l %%a in (1,1,1000) do (
- set kb=!b:~%%a,1!
- if not defined kb (
- set lb=%%a
- goto :start_b
- )
- )
- :start_b
- if !la! == !lb! (
- set l=!la!
- set /a m=!a:~0,1!+!b:~0,1!
- if !m! geq 9 (
- set n=1
- ) else (
- set n=0
- )
- ) else (
- set n=0
- )
- if !la! gtr !lb! (
- set /a l=!la!+!n!
- ) else (
- set /a l=!lb!+!n!
- )
- for /l %%a in (1,1,!l!) do (
- if !la! geq %%a (
- set x=!a:~-%%a,1!
- ) else (
- set x=0
- )
- if !lb! geq %%a (
- set y=!b:~-%%a,1!
- ) else (
- set y=0
- )
- if defined o (
- set /a z=!x!+!y!+!o!
- set o=
- ) else (
- set /a z=!x!+!y!
- )
- if !z! gtr 9 set o=1
- set /p =!z:~-1,1!<nul>>%temp%\temp.txt
- set /p all=<%temp%\temp.txt
- )
- for /l %%a in (1,1,!l!) do set /p =!all:~-%%a,1!<nul>>%temp%\temp_.txt
- set b=!a!
- set /p a=<%temp%\temp_.txt
- del %temp%\temp*.txt /q
- if "!a:~0,1!" == "0" set a=!a:~1!
- echo 第!n_!项为:!a!
- pause>nul
- goto :start
-
复制代码
[ 本帖最后由 lxzzr 于 2009-8-25 14:38 编辑 ]
作者: Taurus 时间: 2009-8-27 21:22
多數位的,用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 编辑 ]
作者: Taurus 时间: 2009-11-16 06: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 编辑 ]
作者: happy886rr 时间: 2016-4-10 22:52
- @echo off&setlocal enabledelayedexpansion
- mode con cols=100 lines=25
- set "Fa[1]=00000001"
- set "Fb[1]=00000001"
- for /l %%i in (2 1 125) do (
- set "Fa[%%i]=00000000"
- set "Fb[%%i]=00000000"
- )
- for /l %%n in (3 1 5000) do (
- set add=0&set "F="
- set/a CYC=%%n/5+8
- for /l %%i in (1 1 !CYC!) do (
- set/a Fn[%%i]=1!Fa[%%i]!+1!Fb[%%i]!
- set/a tmp=Fn[%%i]+add
- set Fa[%%i]=!Fb[%%i]!
- set Fb[%%i]=!tmp:~1!
- if not "!Fb[%%i]!"=="00000000" (set F=!Fb[%%i]!!F!)
- if !tmp! geq 300000000 (set add=1) else (set add=0)
- )
- for /l %%l in (1 1 7) do (
- if "!F:~0,1!"=="0" (set F=!F:~1!)
- )
- echo !F!
- )
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |