首页 > 编程知识 正文

c语言求两个数的最大公约数,最大公约数 算法

时间:2023-05-05 08:33:59 阅读:177061 作者:1884

最大公约数

问题说明:求两个正整数的最大公约数和最小公倍数

要求:

采用三种或多种程序风格良好、能提供友好输入输出的算法解决两个数的最大公约数问题,并求解三个正整数的最大公约数和最小公倍数问题分析。 现有算法包括更加减损(第九章算术)、辗转相除(bhdgz )、stein算法)以及最简单利用计算机运算能力的暴力方法。

算法详解

3358 www.Sina.com/http://www.Sina.com /两个数的最大公约数是指可以同时被它们整除的最大正整数。

将两数设为a、b(ab ),求出a和b的最大公约数的步骤如下。

(1) a除以b )得到ab ) a/b=q.r1 )0=r1 )。

)2)如果r1=0,则(a,b )=b;

(3)如果r1!=0时,再将b除以r1,得到B/R1=Q.R2(0R2)。

(4)如果r2=0,则) a,b )=r1; 如果是r2的话!=0时,r1继续除以r2,……,持续到能被整除为止。

其最后的馀数为0的除数是(a,b )的最大公约数。

柔弱的电脑算法(辗转相除法)转置相除确定两个正整数a和b(ab )的最大公约数gcd(a,b ) :

a mod b=0时,gcd(a,b )=gcd ) b,a mod b ); 否则,gcd(a,b )=gcd (b,a mod b )通过递归运算或循环运算获得结果。

基本原理

流程图

由http://www.Sina.com/http://www.Sina.com/j.Stein于1961年提出的stein算法较好地解决了弱计算机算法的这一缺陷。 Stein算法只有整数移位和加减法。 为了说明Stein算法的正确性,首先要注意以下结论。

GCD(a,a )=a,即一个数和其自身的公约数仍然是其自身。

GCD(ka,kb )=k gcd(a ) a,b ),也就是说最大公约数运算和乘法运算可以交换。 特殊情况下,k=2时,两个偶数的最大公约数必然可以被2整除。

当k和b互为素数时,即使去掉gcd(ka,b )=gcd(a ) a,b ),也就是说去掉大约两个数中只包含在一个中的因子,也不会影响最大公约数。 特别地,k=2时,表示在计算偶数和奇数的最大公约数时,可以将偶数除以2

算法描述

1、对于An=Bn,An (或Bn ) cn为最大公约数,并且算法结束

2、在An=0时,Bn为最大公约数,算法结束

3、Bn=0时,An为最大公约数,算法结束

4、设定A1=A、B1=B和C1=1

5、如果An和Bn都是偶数,An 1=An/2、Bn 1=Bn/2、cn1=cn*2(2(注意,乘以2将整数左移一位即可,除2将整数右移一位即可) )

6、如果An为偶数且Bn不是偶数,则An 1=An/2、Bn 1=Bn、cn1=cn ((2显然不是奇数的约数) )。

7、如果Bn是偶数且An不是偶数,则Bn 1=Bn/2、An 1=An、cn1=cn ((2显然不是奇数的约数) )。

yle="margin-left:0cm;">8、如果An和Bn都不是偶数,则An+1=|An-Bn|/2,Bn+1=min(An,Bn),Cn+1=Cn

9、n加1,转1

代码

流程图

穷举法原理:利用计算机的计算能力,对每一种情况进行计算,最后得出合适的结果流程图

代码

 

调试过程:

1,在输出测试的时候出现了类型的错误,利用str函数得到的数字对象结果装化成字符串对象结果,成功通过调试。

 

2,求两个数的最小公倍数是返回了浮点数,经过检查发现是数学运算的符号的问题。

通过修改数学运算符号,即蒋单除改成整除符号。修改后的测试结果如下

3, 三个数的测试中出错

最大公约数结果正确,但是最小公倍数出错,通过分析代码,代码中使用的是调用求三个数的最大公约数的算法,求出三个数的最大约束,然后类比于两个数的算法,去实现三个数的最大约束。但是再这个过程中,就存在了误差的使得公倍数的传递出错。于是修改为调用求两个数的最小公倍数再调用以此,即两次调用求出三个数的,不存在误差。

 

最终测试结果如下:

总结:

通过本次的算法编写,完善了自己的代码风格。首先对函数加上了参数结束以及注释,也将上了返回值类型,以及函数课批可转化的docsing解释文档。同时坚持自己的代码符合pep8 的python代码编写风格。再本次的算法代码编写过程中,由于算法具有一定的复杂性,因此,再开始一个算法的时候,都会去用伪代码分析一下流程,发现这样更利于实际代码的编写,也更能帮助自己理清思路。

如一下的伪代码,以后面对复杂的程序,一步一步的完成和测试,通过伪代码来明确自己的思路,效率能有很大的提升。

其次,在代码的编写过程中,会遇到很多的问题,通过本次的编写,熟悉的利用debug工具和熟练的使用输出测试,能让自己很快的找到问题所在,提高效率很关键。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。