• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > 自己用python写了个分解质因数脚本,但是总是出错怎么办?

自己用python写了个分解质因数脚本,但是总是出错怎么办?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了python分解质因数,分解质因数,质因数,质因数是什么,分解质因数的方法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:自己用python写了个分解质因数脚本,但是总是出错怎么办?
描述:

    #Num(original number); Lg(length of original number); Lf(length file);
#Pl(primes list); Pf(prime file); Ps(primes); d(list of answers);
#length(open txt file 'length'); Pb(open txt file 'primebase'); Qpt()

Num=raw_input('Please input a number!\nNumber: ')
Lg=len(Num)
length=open('length.txt','r+')
Lf=length.readlines()
Pb=open('primebase.txt','r+')
Pl=Pb.readlines()
if int(Lg)>int(Lf[0]):
    print 'No enough primes in database!\nUpdating the database...'
    for i in range(int(Lf[0])*10,int(Lg)*10):
        Qpt=0
        for x in range(2,int(i*0.5)+1):
            if i%x==0:
                Qpt+=1
                if Qpt!=0:
                    break
        if Qpt==0 and i!=0 and i!=1:
            Pl.append('%s\n'%str(i))
    Pf=open('primebase.txt','w+')
    Pf.writelines(Pl)
    Pf.close()
    Lf[0]=str(Lg)
    file=open('length.txt','w+')
    file.writelines(Lf)
    file.close()
    print 'Finish updating database!'
    d=[]
    Num=int(Num)
    while Num!=1:
        for i in Pl:
            i=int(i)
            if Num%i==0:
                Num=Num/i
                d.append(i)
    if d==[]:
        print 'Prime number!'
    else:
        print 'Prime factors: '
        for i in d:
            print i
else:
    d=[]
    Num=int(Num)
    while Num!=1:
        for i in Pl:
            i=int(i)
            if Num%i==0:
                Num=Num/i
                d.append(i)
    if d==[]:
        print 'Prime number!'
    else:
        print 'Prime factors: '
        for i in d:
            print i

本人py新手。我的具体思路是,搞两个txt文件分别储存质数库和目前质数库的范围。利用len()函数来判断用户输入的数字是几位数,如果位数超过了数据库的范围,就自行更新数据库。举例:数据库里面有2-10的所有质数,然后我现在输入20,超出范围,程序自行更新数据库到2-100的所有质数,再运算。这样就避免了在没有数据库的情况下因为数字太大运算效率低(牺牲第一次的运算效率来计算质数库)。但是实际使用的时候,我发现我输入100,然后程序开始自主更新数据库,但是更新出来的并不是2-100的所有质数,仅仅到了29。同理,在输入很大的数字的时候,也只能更新到300多左右的质数,也就是说更新的不够多,但是我检查了很多遍代码都没搞明白问题出在哪里,。。

*代码中的注释内容基本解释了所有的变量,方便大家看代码。。。


解决方案1:

这个求素数的算法貌似应该很经典啊。
求素数的算法应该是这样:
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以内的素数。
当然,求素数的算法有很多种,你这种将数据缓存起来的思路是对的,不过算法写的还是应该可以加强些,起码应该可读性更强些。

解决方案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是不恰当的,应该为开平方。
验证自己所写的每行代码,而不是猜测它们如何工作


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 自己用python写了个分解质因数脚本,但是总是出错怎么办?

相关文章

  • 2017-06-07 (python)列出指定目录下的所有目录,代码错在哪?
  • 2017-06-07 各位大神帮忙看下程序哪里出问题了,用OpenGL读数据画点和线
  • 2017-06-07 七牛最近上传速度突然变得很慢,很不稳定,请问如何排查解决
  • 2017-06-07 代码中“物化”是什么意思?
  • 2017-06-07 Mac编译安装php7时提示“freetype-confignotfound”,怎么解决
  • 2017-06-07 我想做个服务器,暂时还没有备案,请问有没有临时网址?
  • 2017-06-07 移动4G下访问七牛图片资源为什么有时会错位或丢失
  • 2017-06-07 laravel51刷新多报Nosupportedencrypterfound
  • 2017-06-07 qiniuJavaSDK是否提供了批量上传功能
  • 2017-06-07 Flask如何获取Post传过来的参数?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 私有空间下载凭证断点续传和下载限制
    • php使用curl提交数据的时候会验证cookie么?
    • 移动4G下访问七牛图片资源为什么有时会错位或丢失
    • pythonmongofindAndModify如何限制数量
    • pipinstall和import的问题
    • (python)电影天堂中的详情页面中『◎国家』中国家两个字中间的空白字符是什么?
    • pthread_join会改变线程id吗?
    • redis服务器重启后Redis就连接不上了
    • (python)SyntaxError:keywordcan'tbeanexpression
    • (flask)请问python27x各个版本之间的差异

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有