home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1995 November / PCWK1195.iso / inne / podstawy / dos / 4dos / 4uzytki / jambtm02.exe / FIBOS255.BTM < prev    next >
Text File  |  1992-11-15  |  2KB  |  44 lines

  1. *REM This batch file is Freeware, free to use and redistribute unmodified *
  2. *REM Jouni Miettunen * jon@stekt.oulu.fi * Oulu * Finland * Europe * 1992 *
  3.  
  4. REM This calculates Fibonacci numbers F(n) = F(n-1) + F(n-2)
  5. REM Upper limit is 255 characters on command line, some 243 digits for a number
  6. REM Timestamp 15-Nov-1992
  7.  
  8. REM 4DOS can handle 16 digit integers, so I can add together 15 digit numbers
  9. REM 6-Nov-92: easy to use max 16 digits. One of these days I'll update this..
  10. REM 15-Nov-92: 4dos calc fixed, can't misuse overflow... ;-(
  11. break on^setlocal^unalias *^set a=0^set b=1^set chunk=15
  12.  
  13. :loop
  14. set c=%b^set b=%a^unset/q a atmp^set sindex=0
  15. set claza=%@len[%c]
  16. set blaza=%@len[%b]
  17.  
  18. :work
  19. set claza=%@eval[%claza-%chunk]^if %claza lt 0 set claza=0
  20. set blaza=%@eval[%blaza-%chunk]^if %blaza lt 0 set blaza=0
  21. set cen=%@eval[%@len[%c]-%sindex*%chunk]^if %cen gt %chunk set cen=%chunk
  22. set ben=%@eval[%@len[%b]-%sindex*%chunk]^if %ben gt %chunk set ben=%chunk
  23.  
  24. set ctmp=%@substr[%c,%claza,%cen]^if "%ctmp"=="" set ctmp=0
  25. set btmp=%@substr[%b,%blaza,%ben]^if "%btmp"=="" set btmp=0
  26.  
  27. set atmp=%@eval[%btmp+%ctmp+%atmp]
  28. iff %@len[%atmp] gt %chunk then^set a=%@substr[%atmp,1,%chunk]%a^set atmp=%@substr[%atmp,0,1]
  29.  else^if %@len[%atmp] lt %chunk .and. %blaza gt 0 gosub zerofix^set a=%atmp%%a^unset/q atmp^endiff
  30. set sindex=%@eval[%sindex+1]
  31. if %blaza gt 0 goto work
  32.  
  33. REM nothing goes forever, yet.. command line can hold up to 255 chars
  34. REM Note: I tested this once against upper limit, but 243 is still just a guess.
  35. set index=%@eval[%index+1]^if "%atmp" != "0" set a=%[atmp]%%a^echo %index: %a
  36. if %@len[%a] le 243 goto loop^goto end
  37.  
  38. REM Problem: sum has less than chunk digits? Need to fill zeros in front..
  39. :zerofix
  40. set atmp=0%atmp^if %@len[%atmp]==%chunk return^goto zerofix
  41.  
  42. :end
  43. break off^quit
  44.