三个数最大公约数python代码while 3个数最大公约数怎么求

您所在的位置:网站首页 求最大公约数python代码循环 三个数最大公约数python代码while 3个数最大公约数怎么求

三个数最大公约数python代码while 3个数最大公约数怎么求

2024-07-12 23:19| 来源: 网络整理| 查看: 265

        如果有一个自然数a能被自然数b整除,则称a为b的倍数,b为a的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数(Greatest Common Divisor,简写为GCD)。例如,自然数12和30的公约数有1、2、3、6,其中6就是12和30的最大公约数。

        求最大公约数有多种方法,常见的有辗转相除法、短除法、更相减损法、质因数分解法等。

1.辗转相除法。

        辗转相除法的基本做法是用较大的数除以较小的数,若余数为0,则其中较小的数(即除数)就是最大公约数;若余数不为0,则用前面较小的除数和得出的余数构成新的一对数,继续做上面的除法,直到出现能够整除的两个数(余数为0)。

        下面以求48和27的最大公约数为例,求解过程如下:

         48 ÷ 27 = 1余 21

         27 ÷ 21 = 1余6

         21 ÷ 6 =3余3

         6 ÷ 3=2

        所以3就是48和27的最大公约数。

       辗转相除法使用到的原理也很简单,假设用f(x, y)表示x,y的最大公约数,取k = x/y,b = x%y,则x = ky + b,如果一个数能够同时整除x和y,则必能同时整除b和y;而能够同时整除b和y的数也必能同时整除x和y,即x和y的公约数与b和y的公约数是相同的,其最大公约数也是相同的,则有f(x, y)= f(y, x%y)(y > 0),如此便可把原问题转化为求两个更小数的最大公约数,直到其中一个数为0,剩下的另外一个数就是两者最大的公约数。

        采用辗转相除法编写的求两个整数m和n的最大公约数的函数及测试主程序如下。

#include int gcd(int m,int n) { int r=m%n; while (r!=0) { m = n; n = r; r = m%n; } return n; } int main() { int m,n,t; while (scanf("%d %d",&m,&n)!=EOF) { t = gcd(m,n); printf("%d\n",t); } return 0; }

          这个函数也可以写成递归的形式,如下。

int gcd(int m,int n) { if (m%n==0) return n; return gcd(n,m%n); }

2.短除法。

       短除法是不断地找两个数的最小公约数,直到找不到为止,然后把所有的最小公约数乘起来,就是最大公约数。

       下面以求48和36的最大公约数为例,操作如下:

        从除1外的最小的约数2开始试探起

48 ÷ 2 = 24   36 ÷ 2 =18 ,2是约数

24 ÷ 2 = 12   18 ÷ 2 =9 , 2还是约数

12 ÷ 3 = 4    9 ÷ 3 =3 ,  3是约数

4和3不存在公约数,结束。

所以,2×2×3=12就是48和36的最大公约数。

采用短除法编写的求两个整数m和n的最大公约数的函数如下。

int gcd(int m,int n) { int i,r = 1; for (i=2;i (9,6) -> (3,6) -> (3,3)

所以,3就是24和15的最大公约数。

采用更相减损法编写的求两个整数m和n的最大公约数的函数如下。

int gcd(int m,int n) { int t; while (m!=n) { if (m>1, b>>1);

当a为偶数,b为奇数时,gcb(a,b) = gcb(a/2, b) = gcb(a>>1, b)

当a为奇数,b为偶数时,gcb(a,b) = gcb(a, b/2) = gcb(a, b>>1)

当a和b均为奇数,利用更相减损术运算一次,gcb(a,b) = gcb(b, a-b),此时a-b的结果必然是偶数,又可以继续进行移位运算。

        采用 Stein算法编写的求两个整数m和n的最大公约数的函数如下。

int gcd(int m,int n) { int p=1,t; while (m%n!=0) { if (m>1; n=n>>1; } else { m=m>>1; } } else { if (n%2==0) { n=n>>1; } else { m=m-n; m=m>>1; } } } return p*n; }

          这一算法可以写成递归的形式,如下。

int gcd(int m,int n) { if (m < n) { int tmp = m; m = n; n = tmp; } if (m%n==0) return n; if (m % 2 == 0 && n % 2 == 0) return 2*gcd(m >> 1, n >> 1); else if (m%2 == 0 && n%2 != 0) return gcd(m >> 1, n); else if (m%2 != 0 && n % 2 == 0) return gcd(m, n >> 1); else if (m % 2 != 0 && n % 2 != 0) return gcd(n, (m - n) >> 1); }

 【例1】最大最小公倍数。

问题描述

已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。

输入

输入一个正整数N(1



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3