![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-29 07:06 |
共 47,816 主题排行 / 349,916 发帖 / 今日 2 篇 / 48,265 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 特大数字运算的解决办法 |
| 可打印版本 2,312 / 13 |
| 第1楼 youxi01 | 发表于 2006-11-19 02:20 |
| 高级用户 发帖 247 积分 846 来自 湖南==》广东 | |
|
特大数字运算的解决办法 大家都知道,在批处理中,无法对过大的数字进行运算,那我们如何突破此限制呢?解决办法希望大家跟帖讨论......
我这里提供我的一种思路,我把它叫“列竖式法”,因为它跟小学的“列竖式”很相似,就是分别拿下面的数字中的每个数字跟上面的数据相乘,然后把所以的数据加起来,从而得到答案,此法就是据此而来...... 测试代码: 说明:上述代码目前支持100位以内的数字相乘;对于以上代码起码还有另外的改进方案,可以提高运行效率,就是以前本人在另外一个帖子《用批处理作趣味数学题提过的,分段计算法,推荐使用5个数字分成一段,这样的话就可以避免大量的重复而频繁的计算,从而提高运行效率,至于后一种计算方法,还在测试阶段。 以上只是我的一种解决思路,希望大家批评指正! |
|
| 第2楼 vkill | 发表于 2006-11-19 02:35 |
| 金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽 | |
|
记得那个挑战批处理运算中这些都有提到
|
|
| 第3楼 youxi01 | 发表于 2006-11-19 03:06 |
| 高级用户 发帖 247 积分 846 来自 湖南==》广东 | |
|
看样子,我这新手又开错了帖子了!
原来已经有了讨论了! http://www.cn-dos.net/forum/viewthread.php?tid=23568&fpage=1&highlight=%E5%8F%82%E4%B8%8E 不过以上的计算方法,有缺点(暂不支持浮点数计算),但更有优点,在处理特别大的数字时,运行效率要高很多。 在同样的情况之下,以上帖子提供的代码计算123456789101112131415161718192021222324252627282930*123456789101112131415161718192021222324252627282930要好久,但以上代码两三秒就搞定 |
|
| 第4楼 zouzhxi | 发表于 2006-11-19 04:00 |
| 中级用户 发帖 177 积分 430 来自 广东深圳 | |
|
如果把它改成除法,能算出圆周率吗PI=3.14……
|
|
| 第5楼 不得不爱 | 发表于 2006-11-19 04:49 |
| 超级版主 发帖 2,044 积分 5,310 来自 四川南充 | |
|
怎么我用楼主的代码他说是
找不到操作数。 找不到操作数。 啊 |
|
| 第6楼 youxi01 | 发表于 2006-11-19 06:48 |
| 高级用户 发帖 247 积分 846 来自 湖南==》广东 | |
|
我这里没有问题哦!
![]() 至于圆周率的计算,用批处理,有难度~我觉得是这样。 |
|
| 第7楼 electronixtar | 发表于 2006-11-19 06:48 |
| 铂金会员 发帖 2,672 积分 7,493 | |
|
直接模拟汇编,用位运算可能是个好的思路
|
|
| 第8楼 不得不爱 | 发表于 2006-11-19 06:58 |
| 超级版主 发帖 2,044 积分 5,310 来自 四川南充 | |
|
原来是set /a num%%i%2=!var:~%%i,1!有错误,应该是:
set /a num%%i%~2=!var:~%%i,1! |
|
| 第9楼 youxi01 | 发表于 2006-11-19 07:11 |
| 高级用户 发帖 247 积分 846 来自 湖南==》广东 | |
|
想不明白,为什么“set /a num%%i%~2=!var:~%%i,1! “可以防止部分错误呢?
|
|
| 第10楼 不得不爱 | 发表于 2006-11-19 22:49 |
| 超级版主 发帖 2,044 积分 5,310 来自 四川南充 | |
|
因为call :test %str1% "" ex里的第二个参数是""啊,set /a num%%i%~2=!var:~%%i,1!会自动去掉%2里的"",否则set /a num%%i%2=!var:~%%i,1!就相当于set /a num%%i""=!var:~%%i,1!,这样能不出错吗?
|
|
| 第11楼 不得不爱 | 发表于 2006-11-19 22:54 |
| 超级版主 发帖 2,044 积分 5,310 来自 四川南充 | |
|
另外进位应该从最底位开始,否则也会出错,因为有时会发生连续多次进位,那你那种算法就会出错
|
|
| 第12楼 6622186 | 发表于 2007-04-05 11:27 |
| 高级用户 发帖 411 积分 894 | |
|
65536 乘以 65536 会把每一位数字截去.
|
|
| 第13楼 bjsh | 发表于 2007-04-05 22:15 |
| 银牌会员 发帖 621 积分 2,000 | |
|
我这这里的第26楼写过一段除法的;
被除数理论上可以任意大;最后小数点后精确到的位数理论上可以是任意多位;不过试过100万位确实不行;会提示输出过长; 不过始终没有解决 除数大于 10的九次方的情况 http://www.cn-dos.net/forum/viewthread.php?tid=29097&fpage=5&highlight=&page=2 |
|
| 第14楼 flyinspace | 发表于 2007-04-05 23:36 |
| 银牌会员 发帖 517 积分 1,206 | |
|
呵呵,的确。模拟汇编会更快的计算。方法也更简单。
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |