求两个数字的最大公约数-Python实现,三种方法效率比较,包含质数打印质数的方法
今天面试,遇到面试官询求最大公约数。小学就学过的奥数题,居然忘了!只好回答分解质因数再求解!
回来果断复习下,常用方法辗转相除法和更相减损法,小学奥数都学过,很简单,就不细说了,忘了的话可以百度:http://baike.baidu.com/link?url=Ba106RbHkMjZm3rolmCHEEFt3eDkVbngcReykcqt4Wv0dbTI_0ZmTDE5b0X-xWFx
以下是代码实现,这两种方法,还有常规的分解因式,顺便比较了一下效率,其中分解因式用了两种方法来求取小于该数字的所有质数,:
#coding:utf-8
import time
#辗转相除法:
def commonDivisor1(num1,num2):
if num1 < num2:
temp = num1
num1 = num2
num2 = temp if num1%num2 ==0:
return num2
else:
num2 = num1%num2
return commonDivisor1(num1,num2) #更相减损法
def commonDivisor2(num1,num2):
if num1==num2:return num1
elif num1 < num2:
temp = num1
num1 = num2
num2 = temp
if num1 - num2 == num2:
return num2
else:
temp = num1
num1 = num2
num2 = temp - num2
#print (num1,' ', num2)
return commonDivisor2(num1,num2) #分解质因数,之后求解
def commonDivisor3(num1,num2):
if num1==num2:return num1
elif num1 < num2:
temp = num1
num1 = num2
num2 = temp
#求小于较小数字的所有素数
primeNum = getPrimeNumber1(num2)
#print (primeNum)
#对较小的数字分解质因数,并将质因数保存在l2中
l2 = []
result = 1
while num2 != 1:
for i in primeNum:
if num2 % i !=0:
continue
else:
l2.append(i)
num2 = num2 / i
#print ('l2: ',l2)
#使用较大数字去除较小数字的质因数,看大数字中包含了哪些较小数字的质因数。
#将大数字也包含的相同的质因数相乘返回结果,即最大公约数
for i in l2:
if num1 % i == 0:
result = result*i
num1 = num1/i
return result #分解质因数,之后求解
def commonDivisor4(num1,num2):
if num1==num2:return num1
elif num1 < num2:
temp = num1
num1 = num2
num2 = temp
#求小于较小数字的所有素数
primeNum = getPrimeNumber2(num2)
#print (primeNum)
#对较小的数字分解质因数,并将质因数保存在l2中
l2 = []
result = 1
while num2 != 1:
for i in primeNum:
if num2 % i !=0:
continue
else:
l2.append(i)
num2 = num2 / i
#print ('l2: ',l2)
#使用较大数字去除较小数字的质因数,看大数字中包含了哪些较小数字的质因数。
#将大数字也包含的相同的质因数相乘返回结果,即最大公约数
for i in l2:
if num1 % i == 0:
result = result*i
num1 = num1/i
return result #列出小于num的所有奇数,首先去除可以被2整除的,再去除可以被3整除的,再去除可以被5整除的,以此类推...
def getPrimeNumber1(num):
l = [2]
for i in range(3,num+1,2):
l.append(i)
j = min(l)
while not j == l[-1]:
for k in l:
if (k%j==0) and k != j:
#print ('remove: ',k)
l.remove(k)
#print (l,' ',j)
j = l[l.index(j)+1]
return l #用生成器和filter求num以内的所有质数
def getPrimeNumber2(num):
l=[]
for n in primes():
if n < num:
l.append(n)
else:
break
return l #创建打印奇数的生成器
def _odd_iter():
n = 1
while True:
n = n + 2
yield n #创建过滤条件,即过滤掉可以被列表中下一个数字整除的数字,留下不可以被这个数整除的,即留下质数
def _not_divisible(n):
return lambda x: x % n > 0 #不断迭代生成列表,根据规则过滤掉列表中元素,留下质数
def primes():
yield 2
it = _odd_iter() # 初始序列
while True:
n = next(it) # 返回序列的第一个数
yield n
it = filter(_not_divisible(n), it) # 构造新序列 time1 = time.clock()
print (commonDivisor1(12355,525))
time2 = time.clock()
print (commonDivisor2(12355,525))
time3 = time.clock()
print (commonDivisor3(12355,525))
time4 = time.clock()
print (commonDivisor4(12355,525))
time5 = time.clock() print ('辗转相除法用时: ', (time2-time1)*1000,'秒')
print ('更相减损法用时: ', (time3-time2)*1000,'秒')
print ('分解质因数法用时(用列表求质数): ', (time4-time3)*1000,'秒')
print ('分解质因数法用时(用生成器求质数): ', (time5-time4)*1000,'秒')
测试结果:
随便测试两个数字,发现辗转相除法明显是最快的,原因也很明显,计算次数明显比更相减损法少,传统分解因式方法,那效率自然不用说了。
35
35
35
35
辗转相除法用时: 0.014617272401167485 秒
更相减损法用时: 0.15565419800162134 秒
分解质因数法用时(用列表求质数): 9.131449575150953 秒
分解质因数法用时(用生成器求质数): 8.505277230398239 秒
求两个数字的最大公约数-Python实现,三种方法效率比较,包含质数打印质数的方法的更多相关文章
- JavaScript求两个数字之间所有数字的和
这是在fcc上的中级算法中的第一题,拉出来的原因并不是因为有什么好说的,而是我刚看时以为是求两个数字的和, 很显然错了.我感觉自己的文字理解能力被严重鄙视了- -.故拉出来折腾折腾. 要求: 给你一个 ...
- c 求两个整数的最大公约数和最小公倍数
//求最大公约数是用辗转相除法,最小公倍数是根据公式 m,n 的 最大公约数* m,n最小公倍数 = m*n 来计算 #include<stdio.h> //将两个整数升序排列 void ...
- 算法 - 求两个自然数的最大公约数(C++)
//************************************************************************************************** ...
- 【剑指Offer】和为S的两个数字 解题报告(Python)
[剑指Offer]和为S的两个数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- python selenium 三种等待方式详解[转]
python selenium 三种等待方式详解 引言: 当你觉得你的定位没有问题,但是却直接报了元素不可见,那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素不可见,那就必须要加等待 ...
- mac学习Python第一天:安装、软件说明、运行python的三种方法
一.Python安装 从Python官网下载Python 3.x的安装程序,下载后双击运行并安装即可: Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的. MAC 系统一般 ...
- 学习Python的三种境界
前言 王国维在<人间词话>中将读书分为了三种境界:"古今之成大事业.大学问者,必经过三种之境界:'昨夜西风凋碧树,独上高楼,望尽天涯路'.此第一境也.'衣带渐宽终不悔,为伊消得人 ...
- Python的三种格式化输出
今天刚学了python的三种格式化输出,以前没接触过这么有趣的输出方式,现在来分享一下. #!/user/bin/env python#coding:utf-8#三种格式化输出 #第一种格式化输出na ...
- 求两个整数的最大公约数GCM
思路分析: (1)求差判定法: 如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数 ...
随机推荐
- bzoj3052: [wc2013]糖果公园
又是一代神题. uoj测速rank10,bzoj测速rank26(截止当前2016.5.30 12:58) 带修改的树上莫队. 修改很少,块的大小随便定都能A 然而我一开始把开3次根写成了pow(bl ...
- linux下查看最消耗CPU、内存的进程
2012-11-19 15:38:04 分类: LINUX 1.CPU占用最多的前10个进程: ps auxw|head -1;ps auxw|sort -rn -k3|head -10 2.内存消耗 ...
- 【POJ-1390】Blocks 区间DP
Blocks Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 5252 Accepted: 2165 Descriptio ...
- Zabbix客户端安装
CentOS 7 [root@localhost /]# rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-agent-3 ...
- 使用纯CSS实现带箭头的提示框
爱编程爱分享,原创文章,转载请注明出处,谢谢!http://www.cnblogs.com/fozero/p/6187323.html 1.全部代码 <!DOCTYPE html> < ...
- JAVA中保留小数的多种方法
// 方式一:double f = 3.1516;BigDecimal b = new BigDecimal(f);double f1 = b.setScale(2, BigDecimal.ROUND ...
- 谷歌浏览器,火狐浏览器,ie浏览器解析顺序
谷歌(版本 55.0.2883.87 m),火狐(48.0.2),ie(11.576.14393.0)对三个浏览器简单的进行了一下试验发现,谷歌浏览器是等到html全部解析完毕之后才开始渲染,而另外两 ...
- TTTAttributedLabel xib sb lineSpacing not working
https://github.com/TTTAttributedLabel/TTTAttributedLabel/issues/733 set the same text in storyboard ...
- 测试数组push和unshift方法的效率
先贴代码,之后再来补内容 <!DOCTYPE HTML> <html> <head> <title>测试数组push和unshift方法的效率</ ...
- Postgresql 简单配置 (ubuntu server 14.04.3)
安装和配置 ubuntu server 已经自动安装了progresql,故安装步骤就省略 初始postgresql没有密码,不能使用,需要先设置密码,命令(从网上随意找的)如下: sudo su p ...