![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-08 21:14 |
共 47,811 主题排行 / 349,895 发帖 / 今日 0 篇 / 48,253 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 求最大公约数和最小公倍数 |
| 可打印版本 3,597 / 9 |
| 第1楼 namejm | 发表于 2007-01-24 13:35 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
|
求最大公约数和最小公倍数 看到lxmxn在玩求素数的批处理,我也玩一个,不过这个难度要低得多,没有对输入作容错检查,不保证结果是否发生溢出错误,仅作为茶余饭后的无聊之作:
[ Last edited by namejm on 2007-1-24 at 02:59 PM ] |
|
| 第2楼 willsion | 发表于 2007-01-24 23:14 |
| 高级用户 发帖 312 积分 793 | |
|
呵呵。纯支持一下。
|
|
| 第3楼 ccwan | 发表于 2007-01-25 01:58 |
| 金牌会员 发帖 1,160 积分 2,725 来自 河北廊坊 | |
|
兄的代码确实精彩,我有一点小疑问,两个数的最大公约数可以是1啊,为什么要显示没有最大公约数呢?在数学中,如果两个数是互质数,那么,它们的最大公约数就是1。
附上一段不用for语句的代码 [ Last edited by ccwan on 2007-1-25 at 06:38 AM ] |
|
| 第4楼 namejm | 发表于 2007-01-25 03:08 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
|
Re ccwan 『第 3 楼』:
sorry,基本概念没有记好,犯了低级错误。 你的代码通过辗转求余的方法来计算最大公约数,确实是个比较好的思路,并且速度比我的要快得多,比如用52317和75569来测试,你的代码转瞬间就求出了最大公约数(虽然求最小公倍数的时候出错了),而我的要跑上10S左右才能算出来。 不过我的代码在计算最小公倍数的时候,能处理的数字范围比你的要大一点(你的代码稍微修改一下就可以了),因为你的是通过先把两个数字相乘然后再除以最大公约数来获得,而我的是先把两个数除以最大公约数之后再乘以最大公约数来获得——其实在计算最小公倍数的时候,我有点机械了,代码还可以精简一下,即先除以最大公约数之后再乘以另外一个数。 另外,你的 set/a num2=%a%%%b% 这条语句,其实是钻了set /a运算的空子,不知是你有意为之还是没注意到:在 set /a 运算中,参与运算的变量可以直接用变量名而无须使用百分号对来引用。如果按照一般的理解,这条语句的意思是 %a% 和 %b% 做 % 运算,可是批处理中的 set/a 并没有 % 这个运算符(虽然CMD下有 % 运算符号,但是批处理中的预处理机制并不会把单个的 % 识别为模运算符),而实际上,运算是按照 %% 来操作的,可能的过程是:CMD预处理机制认为 %% 的优先级高于百分号对的引用,从而先扩展模运算符再处理变量的引用,而此时为 %a 模 b%,在 set /a 运算中,找不到变量 a 模 b,从而抛弃前后百分号,变成用 a的值 模 b的值。这个过程仅为推测,不一定正确。建议你把这条语句改成 set/a num2=a%%b 或者 set/a num2=%a%%%%b% ,以避免造成误解。 [ Last edited by namejm on 2007-1-24 at 04:00 PM ] |
|
| 第5楼 ccwan | 发表于 2007-01-25 03:32 |
| 金牌会员 发帖 1,160 积分 2,725 来自 河北廊坊 | |
|
谢谢jm兄的指点,我的考虑是:set/a num2=%a%%%b% 这条语句中若根据兄的意思,改为a%%b的话,cmd运算中会当作a%b,然后查找a,b的值去运算;而我的代码在cmd中会直接取a的值,然后模b,若a=8,则运算式为set/a num2=8%b,这样减少了一个数值的查找,并不会出现错误。
这可以在cmd下通过实验看到。 对于兄的异议,这正是我知识匮乏的结果,不能从根本上了解它的运行机制。我还是在这里改为set/a num2=%a%%%%b%吧,这样比较好理解。 [ Last edited by ccwan on 2007-1-25 at 03:50 AM ] |
|
| 第6楼 20080610 | 发表于 2007-01-25 04:05 |
| 初级用户 发帖 34 积分 83 | |
| 第7楼 namejm | 发表于 2007-01-25 04:22 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
|
呵呵,原来已经有人做过了啊,没仔细搜索旧帖,造成了内容重复,罪过。
不过那个帖子是作为查错帖出现的,而这里提供的是另外的一种思路,合并主题似乎有点不合适,暂时不合并了,看看还有没有其他比较另类的算法或深入的分析出现。 |
|
| 第8楼 pengfei | 发表于 2007-01-25 05:29 |
| 银牌会员 发帖 485 积分 1,218 来自 湖南.娄底 | |
|
namejm兄和ccwan兄写的代码很不错, 辗转相除法的确是求最大公约数和公倍数的最佳算法, 也是平时最常采用的方法.
它在求公约数时, 将被除数和余数分别赋给下一步将要运算的除数和被除数, 直到余数为0止. [ Last edited by pengfei on 2007-1-25 at 10:32 AM ] |
|
| 第9楼 lzmyst | 发表于 2007-01-25 06:01 |
| 新手上路 发帖 10 积分 19 | |
|
暂时还不能完全理解,先COPY下来慢慢看。
|
|
| 第10楼 tao0610 | 发表于 2007-01-25 06:07 |
| 高级用户 发帖 218 积分 579 | |
|
....
|
|
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |