今天面试,遇到面试官询求最大公约数。小学就学过的奥数题,居然忘了!只好回答分解质因数再求解!

回来果断复习下,常用方法辗转相除法和更相减损法,小学奥数都学过,很简单,就不细说了,忘了的话可以百度: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实现,三种方法效率比较,包含质数打印质数的方法的更多相关文章

  1. JavaScript求两个数字之间所有数字的和

    这是在fcc上的中级算法中的第一题,拉出来的原因并不是因为有什么好说的,而是我刚看时以为是求两个数字的和, 很显然错了.我感觉自己的文字理解能力被严重鄙视了- -.故拉出来折腾折腾. 要求: 给你一个 ...

  2. c 求两个整数的最大公约数和最小公倍数

    //求最大公约数是用辗转相除法,最小公倍数是根据公式 m,n 的 最大公约数* m,n最小公倍数 = m*n 来计算 #include<stdio.h> //将两个整数升序排列 void ...

  3. 算法 - 求两个自然数的最大公约数(C++)

    //************************************************************************************************** ...

  4. 【剑指Offer】和为S的两个数字 解题报告(Python)

    [剑指Offer]和为S的两个数字 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  5. python selenium 三种等待方式详解[转]

    python selenium 三种等待方式详解   引言: 当你觉得你的定位没有问题,但是却直接报了元素不可见,那你就可以考虑是不是因为程序运行太快或者页面加载太慢造成了元素不可见,那就必须要加等待 ...

  6. mac学习Python第一天:安装、软件说明、运行python的三种方法

    一.Python安装 从Python官网下载Python 3.x的安装程序,下载后双击运行并安装即可: Python有两个版本,一个是2.x版,一个是3.x版,这两个版本是不兼容的. MAC 系统一般 ...

  7. 学习Python的三种境界

    前言 王国维在<人间词话>中将读书分为了三种境界:"古今之成大事业.大学问者,必经过三种之境界:'昨夜西风凋碧树,独上高楼,望尽天涯路'.此第一境也.'衣带渐宽终不悔,为伊消得人 ...

  8. Python的三种格式化输出

    今天刚学了python的三种格式化输出,以前没接触过这么有趣的输出方式,现在来分享一下. #!/user/bin/env python#coding:utf-8#三种格式化输出 #第一种格式化输出na ...

  9. 求两个整数的最大公约数GCM

    思路分析: (1)求差判定法:  如果两个数相差不大,可以用大数减去小数,所得的差与小数的最大公约数就是原来两个数的最大公约数.例如:求78和60的最大公约数.78-60=18,18和60的最大公约数 ...

随机推荐

  1. Mybatis传入参数类型为Map

    mybatis更新sql语句: <update id="publishT00_notice" parameterType="Map"> update ...

  2. zrt中文题

    orzzrt.... 题意:给n个点n条边,问能形成几个无向连通图公式:ans=Σ(k=3~n){[n^(n-k)]* (n-1)!/2(n-k)!}推导:ans=Σ(k=3~n)(f(n,k)*h( ...

  3. python collections模块

    collections模块基本介绍 collections在通用的容器dict,list,set和tuple之上提供了几个可选的数据类型 namedtuple() factory function f ...

  4. checkbox做全选按钮

    1.先写一个html页面,里面写一个全选按钮和几个复选框,实现下面2个要求 (1)点击全选按钮选中时,所有的复选框选中. (2)点击全选按钮取消选中时,所有复选框取消选中. <input typ ...

  5. 图解Netty之Pipeline、channel、Context之间的数据流向。

    声明:本文为原创博文,禁止转载.       以下所绘制图形均基于Netty4.0.28版本. 一.connect(outbound类型事件)  当用户调用channel的connect时,会发起一个 ...

  6. Java学习笔记--循环总结

    关键字break和continue除了在switch语句中使用break,还可以在一个循环中使用break立即终止该循环. 循环语句有三类: while循环, do-while循环和for循环.循环中 ...

  7. 跟我一起学习VIM

    跟我一起学习VIM - The Life Changing Editor   前两天同事让我在小组内部分享一下VIM,于是我花了一点时间写了个简短的教程.虽然准备有限,但分享过程中大家大多带着一种惊叹 ...

  8. 行列转置(Oracle)

    一.Oracle行列转置 1.行转列 (1)创建表格.插入测试数据 create table student( id number, name ), course ), score number ) ...

  9. Win10 磁盘占用 100% 有效解决办法

    立即查看 任务管理器,看看是不是有一个 服务主机 unistack服务组或者找类似名称的,点开以后你会看到里面有同步主机 blablah请你毫不犹豫的结束它!结束它!结束它! 按下WIN+R调出运行, ...

  10. cas单点登录搭建

    Cas Server下载:http://developer.jasig.org/cas/ Cas Client下载:http://developer.jasig.org/cas-clients/ 测试 ...