更相减损法java代码_Python基于更相减损术实现求解最大公约数的方法
本文实例讲述了Python基于更相减损术实现求解最大公约数的方法。分享给大家供大家参考,具体如下:
先从网上摘录一段算法的描述如下:
更相减损法:也叫 更相减损术,是出自《 九章算术》的一种求最大公约数的算法,它原本是为 约分而设计的,但它适用于任何需要求最大公约数的场合。
《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,即“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
翻译成现代语言如下:
第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
看完上面的描述,我的第一反应是这个描述是不是有问题?从普适性来说的话,应该是有问题的。举例来说,如果我求解4和4的最大公约数,可半者半之之后,结果肯定错了!后面的算法也不能够进行!
不管怎么说,先实现一下上面的算法描述:
# -*- coding:utf-8 -*-
#! python2
def MaxCommDivisor(m,n):
# even process
while m % 2 == 0 and n % 2 == 0:
m = m / 2
n = n / 2
# exchange order when needed
if m < n:
m,n = n,m
# calculate the max comm divisor
while m - n != n:
diff = m - n
if diff > n:
m = diff
else:
m = n
n = diff
return n
print(MaxCommDivisor(55,120))
print(MaxCommDivisor(55,77))
print(MaxCommDivisor(32,64))
print(MaxCommDivisor(16,128))
运行结果:
不用说,上面程序执行错误百出。那么该如何更正呢?
首先,除的2最终都应该再算回去!这样,程序修改如下:
def MaxCommDivisor(m,n):
com_factor = 1
if m == n:
return n
else:
# process for even number
while m % 2 == 0 and n % 2 == 0:
m = int(m / 2)
n = int(n / 2)
com_factor *= 2
if m < n:
m,n = n,m
diff = m - n
while n != diff:
m = diff
if m < n:
m,n = n,m
diff = m - n
return n * com_factor
print(MaxCommDivisor(55,120))
print(MaxCommDivisor(55,77))
print(MaxCommDivisor(32,64))
print(MaxCommDivisor(16,128))
通过修改,上面程序执行结果如下
虽说这段程序写出来看着有点怪怪的,但是总体的算法还是实现了。与辗转相除等算法相比,这个在循环的层级上有一定的概率会减小。特别是最后的两组测试数字对儿,这种情况下的效果要好一些。但是,总体上的算法的效率,现在我还不能够给个准确的衡量。
PS:这里再为大家推荐几款计算工具供大家进一步参考借鉴:
希望本文所述对大家Python程序设计有所帮助。
更相减损法java代码_Python基于更相减损术实现求解最大公约数的方法相关推荐
- java 调用wget_通过命令行执行WGET下载会更快,而通过Java代码执行时会更慢
我正在使用WGET通过java代码下载文件,这需要大约10分钟才能下载20 MB文件.但是通过命令行执行wget下载,同样的文件以10MbPs的速度在7秒内下载.有人知道为什么吗?我该如何改进我的Ja ...
- Java代码访问基于https安全协议的网站或服务器
Java代码访问基于https安全协议的网站或服务器, 一般分为有证书和无证书两种,无证书的大部分都很简单,说一下我遇到的有证书的: 证书类型:pfx,(个人证书带密码) 服务器配置:基于SSL加密模 ...
- python辗转相除_Python基于辗转相除法求解最大公约数的方法示例
Python基于辗转相除法求解最大公约数的方法示例 本文实例讲述了Python基于辗转相除法求解最大公约数的方法.分享给大家供大家参考,具体如下: 之前总结过一次高德纳TAOCP中的最大公约数求解,其 ...
- python辗转相除法求最大公约数的递归函数_Python基于辗转相除法求解最大公约数的方法示例...
本文实例讲述了Python基于辗转相除法求解最大公约数的方法.分享给大家供大家参考,具体如下: 之前总结过一次高德纳TAOCP中的最大公约数求解,其实课后题中的算法修改要求实现的是辗转相除法求解最大公 ...
- python辗转相除法求最大公约数、最小公倍数_Python使用辗转相除法求解最大公约数的方法示例...
本文实例讲述了Python使用辗转相除法求解最大公约数的方法.共享给大家供大家参考,详细如下: 之前总结过一次高德纳TAOCP中的最大公约数求解,其实课后题中的算法改要求实现的是辗转相除法求解最大公约 ...
- python辗转相除法求最大公约数最小公倍数_Python基于辗转相除法求解最大公约数的方法示例...
本文实例讲述了Python基于辗转相除法求解最大公约数的方法.分享给大家供大家参考,具体如下: 之前总结过一次高德纳TAOCP中的最大公约数求解,其实课后题中的算法修改要求实现的是辗转相除法求解最大公 ...
- 线性查找法java代码_Java线性查找和二分查找
Java线性查找和二分查找. 一 线性查找 定义:在一列给定的值中进行搜索,从一端开始逐一检查每个元素,直到找到所需元素的过程. 线性查找又称为顺序查找.如果查找池是某种类型的一个表,比如一个数组,简 ...
- 运行sql快还是java代码快,让Java代码跑得更快
1.将一些系统资源放在池中,如数据库连 接,线程等.在standalone的应用中,数据库连接池可以使用一些开源的连接池实现,如C3P0,proxool和DBCP等,在运行在容器中的应 用这可以使用服 ...
- java 日期的加减_用java实现日期类的加减
Java代码 public class test1 { public static void main(String[] args) { Calendar c = Calendar.getInstan ...
最新文章
- 人机语言(MML: Man-Machine Language)
- javascript onmouseout问题解决方案
- ngx_pagespeed加速nginx
- 概率论 第三章 多维随机变量及其分布
- Python【算法中心 03】Docker部署Django搭建的Python应用流程实例(Docker离线安装配置+Django项目Docker部署)
- jpa原生query_JPA执行原生SQL语句
- 乐视跳过服务器验证,pandwonload不能登录?试试跳过启动验证
- Hbase CallQueueTooBigException 异常处理
- 太难了,斯坦福AI报告曝光!全球190万会AI,中国有5万
- oracle raw如何生成,如何使用raw device构建Oracle数据库
- mysql临时表多线程时能用吗_学会使用临时表优化,切记不要乱用临时表(记录一)...
- linux维文字体如何下载,uyghurfont
- 【项目实战】别出心裁的小程序简历,让面试官耳目一新(第一个自己独立完成的小程序)
- css实现文本溢出时显示省略号(单行)
- java while 死循环_java while (true) 死循环
- 每日一课 | AES加密和解密(CBC模式)
- 考虑结构预应力的坎贝尔图分析
- 阿里M8每天肝到凌晨,竟是只为一份文档把分布式到微服务讲清楚
- 每日算法_4月11日_02
- 豆瓣APP上线7.0新版本,从工具到社区的进化之路
热门文章
- 百度移动玩“智能”嗨了,PC百度卫士也“按捺不住”了?
- html获取文本框光标位置,html 在编辑框中如何定位光标和获取光标最后位置
- 汽车安全攻击篇:智能网联系统的短板,如何防护汽车的安全
- 曼达洛人对机器人的评价_机器人作文评语大全
- Android ProgressBar控件
- FZU 1922 非主流
- 基克的聚合 机器人_lol机器人出装?lol机器人辅助出装2020
- JavaScript动画性能优化
- NFD开发指南-2.Face系统
- PHP垃圾回收机制----引用计数基础知识