算法 - 自己用python写了个分解质因数脚本,但是总是出错怎么办?
迷茫
迷茫 2017-04-17 14:33:14
[Python讨论组]
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(2)
伊谢尔伦

先回答你的问题,请检查你的第一个for循环的范围。range(1 * 10,2 * 10) 是从10到20的数字。但你想要的是从10到100的序列。

下面是这段代码更大的问题,而你并不知道这些问题的存在。
作为python新手,你问出这个问题,但实际上无论你用什么语言,这些错误都是存在的。问题不在于对语言的掌握程度,而是对“写程序”这一技能的掌握程度。
你的程序大概做了几件事:
1. 根据一个数字和一个质数列表,得到这个数字的质数因子
2. 输出质数因子
3. 获得从1到目标位数的质数列表
4. 根据已有数字位数,和所需数字位数,产生对应范围的质数列表
5. 将计算结果的位数和质数列表存储于某处
6. 从某处读取目前存储的质数列表和其对应的位数

在这段代码里所有的事情都混杂在一起。这样的坏处是,当一件事情变化时,其它部分也会受影响,即使它们并不真正与之相关。
想象一下有一个网站提供服务给出质数列表。你的代码会怎么改变
想象你的程序的输出是个页面
你能否写一段完全不用修改的代码可以用在上述不同场景?

当程序正确的分块后,你可以分别验证它。就算你自己找不到出错的地方,但你至少知道1,2,3,5,6都可以正常工作,因而查找范围或提问都会有针对性得多。

另有一个小问题,产生质数的代码中优化上限*0.5是不恰当的,应该为开平方。
验证自己所写的每行代码,而不是猜测它们如何工作

迷茫

这个求素数的算法貌似应该很经典啊。
求素数的算法应该是这样:
1)输入字符,假设为number, 判断number是否大于0
2)求平方根加1,设置为a
3) number对1~a之间的数字判断是否取余为0即可。
比如你输入15,那么取余+1,应该是4. 那么你就依次判断1~4之间的数是否能整除15即可。
python代码

import math


def isPrime(number):
    assert number >= 0
    if number == 0 or number == 1:
        return False
    sqrtNumber = int(math.sqrt(number)) + 1
    for i in range(sqrtNumber, 1, -1):
        if not number % i:
            return False
    return True


def getAllPrimes(number):
    retval = []
    for i in range(number):
        if isPrime(i):
            retval.append(i)
    return retval


if __name__ == '__main__':
    import time

    start = time.time()
    getAllPrimes(10 * 10000)
    print time.time() - start
  在我的机子上用了1.5秒求了10w以内的素数。
当然,求素数的算法有很多种,你这种将数据缓存起来的思路是对的,不过算法写的还是应该可以加强些,起码应该可读性更强些。
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号