【背景】

  我需要从N遍历到1,当我已经判断N不符合要求时,我知道N的所有约数也是不符合的,所以所有N的约数也不用遍历。因此,对于遍历的每个N,我需要快速找到它的所有约数,放到一个集合里面,而当我遍历到N'时,如果N'在集合里,我就不需要再进行判断了(假设每次判断所需要的时间远远大于约数的判断),这样我就节省了大量的时间。

【解决】

  stackoverflow里面有个高效的答案,如下:

 1 from functools import reduce
2
3 def factors(n):
4 return set(reduce(list.__add__,
5 ([i, n//i] for i in range(1, int(n**0.5) + 1) if n % i == 0)))

【解析】

  1、欲找N的约数,只需要在N^1/2(根号N)范围内找到半数的约数即可,剩下的半数(大约数)可直接通过N除以小的约数找到。

    因此:  range(1,int(n**0.5)+1) --> 半数(小约数)范围

         n %i == 0 --> 半数(小约数)数值

         n // i --> 剩余半数(大约数)数值

  2、将找到的所有约数对列表,展开为一个大的列表。

    因此:  reduce( list.__add__, (列表对) )

  3、对于完全平方数,i == n//i,因此展开的列表中会有两个一样的数值。

    因此:  set(列表),去掉重复值。

【效率】

  本机运行结果供参考。

 %timeit factors( 10**1 )

 OUT:100000 loops, best of 3: 5.53 μs per loop

 %timeit factors( 10**2 )

 OUT:100000 loops, best of 3: 8.03 μs per loop

 %timeit factors( 10**3 )

 OUT:100000 loops, best of 3: 11.1 μs per loop

 %timeit factors( 10**6 )

 OUT:100000 loops, best of 3: 133 μs per loop

 %timeit factors( 10**10 )

 OUT:100000 loops, best of 3: 19.8 ms per loop

【引用】

  https://stackoverflow.com/questions/6800193/what-is-the-most-efficient-way-of-finding-all-the-factors-of-a-number-in-python?r=SearchResults

<转>快速找到整数约数集方法<python><stackoverflow>的更多相关文章

  1. python数据结构-如何快速找到多个字典中的公共键

    如何快速找到多个字典中的公共键 问题举例 统计每轮都进球的球员: 第1轮{‘tom’:1, 'meixi':2} 第2轮{‘coco’:3, 'meixi':4, 'marton':2} 第3轮{'c ...

  2. web页面中快速找到html对应元素两种方法

    一.第一种方法(通过先进入开发模式然后再去选择网页元素) 1.打开IE.Chrome.FireFox等,按 F12 键进入开发模式 2.在打开的控制窗口左上角有个  箭头 按钮,点击它之后,此时将鼠标 ...

  3. asp页面快速找到菜单按钮转向的页面的方法

    asp页面快速找到菜单按钮转向的页面的方法: 鼠标放在按钮上,右键属性即可查看

  4. 5、如何快速找到多个字典中的公共键(key) 6 如何让字典保持有序 7 如何实现用户的历史记录功能(最多n条)

    5.如何快速找到多个字典中的公共键(key) from random import randint,sample #随机取数 # a = sample("ABCDEF",randi ...

  5. 记一些之前忘记积累的问题(fiddler 学习、XP系统不能上网、XP不能装fiddler、注册表快速找到)

    记一些之前忘记积累的问题: fiddler学习:http://www.cnblogs.com/kingwolf_JavaScript/archive/2012/11/07/FiddlerUI.html ...

  6. 快速找到Office应用程序安装路径

    p{ font-size: 15px; } .alexrootdiv>div{ background: #eeeeee; border: 1px solid #aaa; width: 99%; ...

  7. 怎样快速找到某一行代码的git提交记录

    利用notepad++提高问题分析效率,以及快速找到某一行代码的git提交记录 1. 全目录搜索/替换 Notepad++是一款强大的文本编辑工具,当知道大概的关键词但不知道在哪个日志时可以使用not ...

  8. SQL Server 2008 R2:快速清除日志文件的方法

    本例,快速清理“students”数据库的日志,清理后日志文件不足1M. USE [master] GO ALTER DATABASE students SET RECOVERY SIMPLE WIT ...

  9. linux几种快速清空文件内容的方法

    linux几种快速清空文件内容的方法 几种快速清空文件内容的方法: $ : > filename #其中的 : 是一个占位符, 不产生任何输出. $ > filename $ echo & ...

随机推荐

  1. Using RequireJS in AngularJS Applications

    http://www.sitepoint.com/using-requirejs-AngularJS-applications/ While writing large JavaScript appl ...

  2. c++11线程池

    #pragma once #include <future> #include <vector> #include <atomic> #include <qu ...

  3. linux系统下安装tomcat服务器

    一.首先需要关闭linux防火墙(重启后生效) chkconfig iptables off 二.从官网上下载Linux合适版本的tomcat,我现在下来的文件为apache-tomcat-8.5.3 ...

  4. 初探Margin负值(转)

    相对而言,margin 负值的使用机率在布局中似乎很少,但是我相信一旦你开始掌握就会着迷,接下来我们看看关于margin负值的一些资料: 它是一个有效的属性,至少w3c中明确描述如下:”Negativ ...

  5. flask完成文件上传功能

    在使用flask定义路由完成文件上传时,定义upload视图函数 from flask import Flask, render_template from werkzeug.utils import ...

  6. vue国际化高逼格多语言

    ## 1.NPM 项目安装 ``` cnpm i vue-i18n ``` ## 2.使用方法 ``` /* 国际化使用规则 */ import Vue from 'vue' import VueI1 ...

  7. Series

    Series是一种类似于一维数组的对象,是由一维数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成. In [1]: from pandas import Series In [2 ...

  8. 十八、Hadoop学记笔记————Hbase架构

    Hbase结构图: Client,Zookeeper,Hmaster和HRegionServer相互交互协调,各个组件作用如下: 这几个组件在实际使用过程中操作如下所示: Region定位,先读取zo ...

  9. 解决Kali用户名密码正确但是无法登陆的问题

    本文由荒原之梦原创,原文链接:http://zhaokaifeng.com/?p=684 前言: 用户名和密码都正确,但是登陆Kali的时候总是提示用户名或密码错误,无法登陆,本文介绍一种解决办法. ...

  10. spring-boot-oracle spring-batch

    Install/Configure Oracle express Oracle xe installer for linux (I don't care if you're running linux ...