中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » Goto模拟递归计算N的阶乘:)
作者:
标题: Goto模拟递归计算N的阶乘:) 上一主题 | 下一主题
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『楼 主』:  Goto模拟递归计算N的阶乘:)

深受 pengfei 大侠的 “ :again ... goto again ” 精彩应用的启发,
学着楼主运用的goto原理试着做了一个模拟递归求N!的实验,goto用好了真是方便~:)
再一次感谢 pengfei 大侠这篇  关于数值运算时的进制问题  的大作~:)


计算N的阶乘:)
没有越界和没有非法检查。
为了学习goto的运用之作~:)
@echo off
setlocal ENABLEDELAYEDEXPANSION

set /p n=请输入 N! :
set /a redtek=!n!
if !n!==0 (echo 0的阶乘为1 && goto :Eof )

:Start

        set /a n-=1
        if !n!==0 goto :Ok
        set /a redtek*=n
        goto :Start

:Ok
        echo 阶乘为:!redtek!
        echo 最大只能计算到 31的阶乘,再大溢出~:)


2006-9-30 00:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
namejm
荣誉版主

batch fan


积分 5226
发帖 1737
注册 2006-3-10
来自 成都
状态 离线
『第 2 楼』:  

  呵呵,set /a redtek*=n 的写法不错。

  不过这段代码可以把变量延迟去掉,把所有的叹号对改为百分号对,这样代码就比较简洁了。如果再加上错误检测,流程优化,提示信息的优化……这段代码就更完美了。



尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
2006-9-30 01:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 3 楼』:  

多谢版主指导~~:)

2006-9-30 01:31
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 4 楼』:  

你是什么系统?我在2000里算到13就溢出!
下面是我用FOR写的!

  Quote:
@echo off
set /p n=请输入 N! :
set /a redtek=1
if n==0 echo 0的阶乘为1 && goto :Eof

for /l %%i in (1,1,%n%) do set /a redtek*=%%i

:Ok
echo 阶乘为:%redtek%
echo 最大只能计算到 31的阶乘,再大溢出~:)





我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-10-2 20:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 5 楼』:  

系统版本: Windows Server 2003
Microsoft Windows [版本 5.2.3790]

[code]

C:\TEMP>copy con a.bat
@echo off
set /p n=请输入 N! :
set /a redtek=1
if n==0 echo 0的阶乘为1 && goto :Eof

for /l %%i in (1,1,%n%) do set /a redtek*=%%i

:Ok
echo 阶乘为:%redtek%
echo 最大只能计算到 31的阶乘,再大溢出~:)
^Z
已复制         1 个文件。

C:\TEMP>a
请输入 N! :31
阶乘为:738197504
最大只能计算到 31的阶乘,再大溢出~:)

C:\TEMP>a
请输入 N! :32
阶乘为:-2147483648
最大只能计算到 31的阶乘,再大溢出~:)

[code]

到32的阶乘时溢出:)

2006-10-2 23:54
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 6 楼』:  

版主这段代码巧妙,一个循环就全解决了,够精练!佩服~:)

2006-10-3 00:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 7 楼』:  

31的阶乘为:738197504?
不对吧!
应该是8.22283865417792281772556288e+33啊
应该是在13的阶乘时溢出,不信你试下!(12的的阶乘=479001600)

[ Last edited by qwe1234567 on 2006-10-3 at 00:05 ]



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-10-3 00:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 8 楼』:  

嗯,CALC验证了一遍,到12的时候正确,13!就溢出了:)

Microsoft Windows XP [版本 5.1.2600]

Windows Server 2003 两个机器全试了一下,全都是到13就溢出了,哈哈……

2006-10-3 01:09
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 9 楼』:  

cmd里最大的数是2147483647



我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-10-3 02:30
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: