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

[批处理练习]算一算三年内你能养多少兔子?

本帖最后由 mxxcgzxxx 于 2011-6-7 13:05 编辑

800年前,意大利的数学家斐波纳契出版了惊世之作《算盘书》。在《算盘书》里,他提出了著名的“兔子问题”:假定一对兔子每个月可以生一对兔子,而这对新兔子在出生后第二个月就开始生另外一对兔子,这些兔子不会死去,那么一对兔子一年内能繁殖多少对兔子?
答案是一组非常特殊的数字:1,1,2,3,5,8,13,21,34,55,89……不难发现,从第三个数起,每个数都是前两数之和,这个数列则称为“斐波纳契数列”,其中每个数字都是“斐波纳契数”。

求解:批处理采用不同的思路算出3年以后的兔子数!

老手可以思考下超过3年9个月怎么办,能正确输出5年后的数据吗?
世界上没有学不会的知识,也没有想得到却做不到的事!

此题不难,在cn-dos做新手的时候就做过。。。

贴子是不是发错版块了。。。
***共同提高***

TOP

有些不太明白,为什么不发到练习区里,那里关注的人相对来说还是比这儿多的
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

我发不进去没权限
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

本题算法是很简单的,主要是超过一定的序列后会生成大数是CMD不接受的,要正确输出就需要处理了
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

本帖最后由 zm900612 于 2011-6-7 13:18 编辑

算是很容易,不过超过上限怎么办
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a l=3*12
  3. set tmp=0 1
  4. for /l %%a in (-%l%) do (
  5.    for /f "tokens=1,2" %%b in ("!tmp!") do set /a tmp=%%a+%%b
  6.    set tmp=%%b !tmp!
  7. )
  8. echo %tmp%
  9. pause
复制代码
前头绕弯了,这样更好:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a l=3*12,a=0,b=1
  3. for /l %%a in (-%l%) do (
  4.    set /a "b=a+(a=!b!)"
  5. )
  6. echo %b%
  7. pause
复制代码
1

评分人数

TOP

本帖最后由 mxxcgzxxx 于 2011-6-7 12:43 编辑

6# zm900612


1\出错:找不到文件%b

2\-1869596475

set /a 计算超过32位的数会变成负数进行循环计算不会显示出错信息
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

已修改
大数计算用纯批来做很勉强,虽然加法是其中最简单的...

TOP

本帖最后由 mxxcgzxxx 于 2011-6-7 13:40 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a a=0,b=1,c=0
  3. for /l %%1 in (0,1,2) do (
  4.    for /l %%i in (1,1,12) do set /a "c=(b=a+(a=!b!))*2"
  5.    )
  6. echo 3年后你有%b%对兔子,其中%a%对为成年兔,共%c%只兔子!
  7. echo PS:如果中途你不吃或病死的话!
  8. pause>nul
复制代码
嗯,只能算到45个月是正常的,也就是3年9个月
给新人做题那我就改成3年吧

这题关键 的地方是初始的两个数 1 和另一个隐数 0
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

本帖最后由 zm900612 于 2011-6-7 13:55 编辑

大数应该都是这样算的吧:
  1. @echo off&setlocal enabledelayedexpansion
  2. set a=1023423423324
  3. set b=1231232
  4. for %%a in ("a1=!a:~-9!" "a2=!a:~0,-9!" "b1=!b:~-9!" "b2=!b:~0,-9!") do (
  5.    for /f "tokens=1* delims==0" %%b in (%%a) do set /a "%%b=%%c-0"
  6. )
  7. set /a "n=a1+b1","m=a2+b2+m%%1000000000"
  8. echo %a1%  %a2%  %b1%  %b2%  %m%  %n%
  9. for /f "tokens=* delims=0" %%a in ("0!m!!n!") do echo %a%+%b%=%%a
  10. pause
复制代码
笔算的办法...

TOP

为什么我按题中给出的:“斐波纳契数列”,方法,用最笨的方式,算出来答案与各位的答案都不一样:
  1. @echo off&setlocal enabledelayedexpansion
  2. set /a b12=1+1+2+3+5+8+13+21+34+55+89+(55+89)
  3. echo 1年后你有%b12%对兔子
  4. pause>nul
  5. set /a b13=89+(55+89)
  6. set /a b14=(55+89)+!b13!
  7. set /a b15= !b13!+!b14!
  8. set /a b16=!b14!+!b15!
  9. set /a b17=!b16!+!b15!
  10. set /a b18=!b16!+!b17!
  11. set /a b19=!b18!+!b17!
  12. set /a b20=!b18!+!b19!
  13. set /a b21=!b119!+!b20!
  14. set /a b22=!b20!+!b21!
  15. echo 两年后你有!b22!对兔子
  16. pause
  17. set /a b23=!b21!+!b22!
  18. set /a b24=!b22!+!b23!
  19. set /a b25=!b24!+!b23!
  20. set /a b26=!b24!+!b25!
  21. set /a b27=!b25!+!b26!
  22. set /a b28=!b26!+!b27!
  23. set /a b29=!b28!+!b27!
  24. set /a b30=!b28!+!b29!
  25. set /a b31=!b29!+!b30!
  26. set /a b32=!b30!+!b31!
  27. set /a b33=!b31!+!b32!
  28. set /a b34=!b32!+!b33!
  29. set /a b35=!b33!+!b34!
  30. set /a b36=!b34!+!b35!
  31. echo 两年后你有!b36!对兔子
  32. pause
复制代码
1

评分人数

    • mxxcgzxxx: 想法不错虽然有点累不过也算一种方法技术 + 1

TOP

11# common

第14句 b19写成b119了!:(

另外你没有进入语块不用!!开变量延时。
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

返回列表