楼 主
Goto模拟递归计算N的阶乘:)
发表于 2006-09-30 00:52 · 中国 北京 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
深受 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的阶乘,再大溢出~:)
第 2 楼
发表于 2006-09-30 01:21 · 中国 广东 佛山 广东睿江科技有限公司
荣誉版主
★★★★
batch fan
积分 5,226
发帖 1,737
注册 2006-03-10 00:38
20年会员
UID 51697
来自 成都
状态 离线
呵呵,set /a redtek*=n 的写法不错。
不过这段代码可以把变量延迟去掉,把所有的叹号对改为百分号对,这样代码就比较简洁了。如果再加上错误检测,流程优化,提示信息的优化……这段代码就更完美了。
尺有所短,寸有所长,学好CMD没商量。
考虑问题复杂化,解决问题简洁化。
第 3 楼
发表于 2006-09-30 01:31 · 中国 北京 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
第 4 楼
发表于 2006-10-02 20:10 · 中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
20年会员
UID 42843
性别 男
来自 四川南充
状态 离线
你是什么系统?我在2000里算到13就溢出!
下面是我用FOR写的!
@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的阶乘,再大溢出~:)
第 5 楼
发表于 2006-10-02 23:54 · 中国 北京 朝阳区 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
系统版本: 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的阶乘时溢出:)
第 6 楼
发表于 2006-10-03 00:01 · 中国 北京 朝阳区 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
版主这段代码巧妙,一个循环就全解决了,够精练!佩服~:)
第 7 楼
发表于 2006-10-03 00:04 · 中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
20年会员
UID 42843
性别 男
来自 四川南充
状态 离线
31的阶乘为:738197504?
不对吧!
应该是8.22283865417792281772556288e+33啊
应该是在13的阶乘时溢出,不信你试下!(12的的阶乘=479001600)
[ Last edited by qwe1234567 on 2006-10-3 at 00:05 ]
第 8 楼
发表于 2006-10-03 01:09 · 中国 北京 朝阳区 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
嗯,CALC验证了一遍,到12的时候正确,13!就溢出了:)
Microsoft Windows XP [版本 5.1.2600]
和
Windows Server 2003 两个机器全试了一下,全都是到13就溢出了,哈哈……
第 9 楼
发表于 2006-10-03 02:30 · 中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
20年会员
UID 42843
性别 男
来自 四川南充
状态 离线
论坛跳转: