![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-10 15:52 |
共 47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,255 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [讨论][共同参与]求1到1000所有素数的和 |
| 可打印版本 4,190 / 23 |
| 第1楼 lxmxn | 发表于 2007-01-24 11:01 |
| 版主 发帖 4,938 积分 11,386 | |
|
[讨论][共同参与]求1到1000所有素数的和 无聊的时候玩了一把黑客游戏,有一关是一个编程题,题目是求1到1000所有的素数的和,然后加一个sixtoseven.asp就是下一关的地址。 想来自己不会其它的编程语言,于是就用批处理脚本写了一个出来了,但是效率实在是令人不敢恭维,于是放出来让大家也来参与一下,应该用怎样的算法使这个批处理脚本的运行效率提高。如果遇到好的算法,我会酌情加分的,以表鼓励。 我写的代码如下: |
|
| 第2楼 vkill | 发表于 2007-01-24 11:18 |
| 金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽 | |
|
回去想想
[ Last edited by vkill on 2007-1-24 at 11:20 AM ] |
|
| 第3楼 lxmxn | 发表于 2007-01-24 11:24 |
| 版主 发帖 4,938 积分 11,386 | |
Originally posted by vkill at 2007-1-23 22:18: 帖一个网上的解释吧:来自http://sjweb.hhit.edu.cn/article/show.aspx?id=933&cid=71
|
|
| 第4楼 namejm | 发表于 2007-01-24 12:25 |
| 荣誉版主 发帖 1,737 积分 5,226 来自 成都 | |
|
寻找素数在2005年似乎有了新的方法,这种方法出奇地简单,简单到足以让数学家们警觉起来,请看这篇文章:http://www.irgoc.org/Article/ShowArticle.asp?ArticleID=85。奈何本人不懂那些代码的具体含义,难以转化为批处理来解决,哪位懂得的不妨来转换一下。不过,里面用到了log运算,估计批处理解决起来会相当的麻烦。
另外,lxmxn 在3楼给出的链接中提到了“从2开始,是则留下,不是则去掉”的方法,经过实地演算(仅测试了1~30这个范围的数),当处理到5这个素数的时候,会去掉19,看来这种方法并不能成立。 [ Last edited by namejm on 2007-1-23 at 11:27 PM ] |
|
| 第5楼 youxi01 | 发表于 2007-01-24 12:48 |
| 高级用户 发帖 247 积分 846 来自 湖南==》广东 | |
|
如果纯粹是处理1000以内的数字的话,采用以下的代码可以提高效率:
|
|
| 第6楼 lxmxn | 发表于 2007-01-24 12:51 |
| 版主 发帖 4,938 积分 11,386 | |
|
嗯,效率的确提高了不少,现在平均是5秒左右的时间完成计算,而我的代码要大约18秒。 |
|
| 第7楼 qzwqzw | 发表于 2007-01-24 13:57 |
| 银牌会员 发帖 636 积分 2,343 | |
|
因为在考虑第三种方案
所以这第二种与5楼有些重复 区别仅在于没有在外层循环对3取模 算法的效率没有明显的提高 |
|
| 第8楼 qzwqzw | 发表于 2007-01-24 14:00 |
| 银牌会员 发帖 636 积分 2,343 | |
|
这是第3种方案
仅拿小于所判断数的平方根的质数去除判断数 以缩小比较范围 可以计算到1~10000的规模 |
|
| 第9楼 0401 | 发表于 2007-01-24 14:14 |
| 中级用户 发帖 88 积分 435 | |
|
很漂亮也,计算速度几乎不受大数的影响。不过一时半刻还看不太懂具体的原理。
|
|
| 第10楼 0401 | 发表于 2007-01-24 14:19 |
| 中级用户 发帖 88 积分 435 | |
|
这个算法数越大,速度就越慢。
lxmxn兄的注释很有意思,以前没发觉,我也借来用用,呵呵。 |
|
| 第11楼 youxi01 | 发表于 2007-01-24 22:28 |
| 高级用户 发帖 247 积分 846 来自 湖南==》广东 | |
|
如果是纯粹的10000以内,用以下的算法可能要快点(测试时间7秒内)
|
|
| 第12楼 youxi01 | 发表于 2007-01-24 22:30 |
| 高级用户 发帖 247 积分 846 来自 湖南==》广东 | |
|
8F的方案中 在循环中 “引用”了 call ,会大大降低效率的!
我的看法是宁愿牺牲一些不必要的数字(比如,在计算101是不是质数时,根据你的意思是没必要算到它能不能被97整除),不过因为可以不使用call,却倒使效率更高(因为纯粹只使用for循环) [ Last edited by youxi01 on 2007-1-24 at 10:33 PM ] |
|
| 第13楼 willsion | 发表于 2007-01-24 23:12 |
| 高级用户 发帖 312 积分 793 | |
|
建议版主多搞一些类似的小活动,吸引更多人参与讨论。
因为DOS论坛,基本属于技术性论坛,人气相对较少。 |
|
| 第14楼 lxmxn | 发表于 2007-01-25 00:25 |
| 版主 发帖 4,938 积分 11,386 | |
|
呵呵,一晚上的时间又有这么多好的算法啊。 特别是qzwqzw兄的第三个方案、0401以及youxi01在11楼的方案,效率都有明显的提高,看来要多花点时间来研究一下算法了,多谢各位的参与,今天加不成分,改天给各位加分鼓励。 |
|
| 第15楼 pengfei | 发表于 2007-01-25 04:42 |
| 银牌会员 发帖 485 积分 1,218 来自 湖南.娄底 | |
|
5F先除去奇数和偶数的方法使运行效率提高不少, 11F采用这种去奇偶数再判断的方法, 同时采用临时文件计算大范围的数的效率大大提高.
筛法求素数: 列出要求的所有素数, 然后逐个判断它们是否素数, 找出一个非素数, 就把它挖掉, 最后剩下的就是素数. 算法: 1. 先将1挖掉; 2. 用2去除它后面的各个数, 把能被2整除的数挖掉, 即把2的倍数挖掉. 3. 用3去除它后面各数, 把3的倍数挖掉. 4. 分别用4,5... 各数作为除数去除这些数以后的各数. 直到除数后面的数已被挖掉为止(事实上, 只需进行到除数n的平方根止). 5. 余下的数都为素数. 上面的算法还可以改进, 以提高效率. 批处理中通过构建数组, 完整地实现用筛法求素数. 此代码当处理范围较小时效率比较理想, 我也用C写了一个, 看来C写出来的程序效率的确很高. 附件 prime.rar (4.25 KiB) |
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |