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

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

[复制链接]
发表于 2011-6-3 23:43:01 | 显示全部楼层 |阅读模式
本帖最后由 mxxcgzxxx 于 2011-6-7 13:05 编辑

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

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

老手可以思考下超过3年9个月怎么办,能正确输出5年后的数据吗?
发表于 2011-6-4 02:34:43 | 显示全部楼层
此题不难,在cn-dos做新手的时候就做过。。。

贴子是不是发错版块了。。。
发表于 2011-6-4 08:59:16 | 显示全部楼层
有些不太明白,为什么不发到练习区里,那里关注的人相对来说还是比这儿多的
 楼主| 发表于 2011-6-4 09:39:36 | 显示全部楼层
我发不进去没权限
 楼主| 发表于 2011-6-7 12:05:07 | 显示全部楼层
本题算法是很简单的,主要是超过一定的序列后会生成大数是CMD不接受的,要正确输出就需要处理了
发表于 2011-6-7 12:30:39 | 显示全部楼层
本帖最后由 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技术 +1 收起 理由
mxxcgzxxx + 1 第一种方法

查看全部评分

 楼主| 发表于 2011-6-7 12:40:06 | 显示全部楼层
本帖最后由 mxxcgzxxx 于 2011-6-7 12:43 编辑

6# zm900612


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

2\-1869596475

set /a 计算超过32位的数会变成负数进行循环计算不会显示出错信息
发表于 2011-6-7 12:57:38 | 显示全部楼层
已修改
大数计算用纯批来做很勉强,虽然加法是其中最简单的...
 楼主| 发表于 2011-6-7 13:03:22 | 显示全部楼层
本帖最后由 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
发表于 2011-6-7 13:29:57 | 显示全部楼层
本帖最后由 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
复制代码
笔算的办法...
发表于 2011-6-7 22:42:38 | 显示全部楼层
为什么我按题中给出的:“斐波纳契数列”,方法,用最笨的方式,算出来答案与各位的答案都不一样:

  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技术 +1 收起 理由
mxxcgzxxx + 1 想法不错虽然有点累不过也算一种方法

查看全部评分

 楼主| 发表于 2011-6-7 22:46:35 | 显示全部楼层
11# common

第14句 b19写成b119了!:(

另外你没有进入语块不用!!开变量延时。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-17 03:48 , Processed in 0.021570 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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