栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【python】高效找因数算法,竞赛题因数算法优化。

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【python】高效找因数算法,竞赛题因数算法优化。

​做练习题的时候没查到python版的教程,于是自己写了一个

先看没过的代码:

def fdy(n):
    lis = []
    for i in range(1,n):
        if n % i == 0:       #判断是否能整除(是否为因数)
            lis.append(i)
    t = lis
    return t
print(fdy(int(input())))

这个是基础版,相信大家都看的懂

优化后的:

def cf(n):
    li = []                             #创建空列表用于存储因数
    for i in range(1, int(n**0.5) + 1): #因数从一开始算,算到原本的数的平方根停止
        if n % i == 0:                  #检测是i是否能被n整除(是否为因数)
            li.append(i)                #将因数 i 加入列列表
            li.append(int(n/i))         #加入 i 所对应的另一个因数
    li = list(set(li))                  #去个重(i恰好为平方根时会重复)
    li.sort()                           #排序(可以不用)
    return li                           #返回处理好的列表
print(cf(int(input())))                 #调用

首先先看这个图——16的因数【1,2,4,8,16】

116
28
44
52
161


可以看出16的因数是成对存在的,而且到平方根的时候就会开始重复

其他数字也遵循这个规律,它们的因数对开始重复的数字也都小于等于他们的平方根,大家可以试试试看

因此,只需要算到即可,对应的数字可以用 n / i 计算得出。

    for i in range(1, int(n**0.5) + 1): #因数从一开始算,算到原本的数的平方根停止
        if n % i == 0:                  #检测是i是否能被n整除(是否为因数)
            li.append(i)                #将因数 i 加入列列表
            li.append(int(n/i))         #加入 i 所对应的另一个因数

它的效率在数字大的时候就能很好的体现出来,例如基础版要检测一万次的时候,优化版只要检测一百次就能达到同样的效果。这个数字越大效果越明显

有不懂的地方可以在评论区留言,我看到的话会回复的。(第一次写,可能写的不是很清楚)

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/850677.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号