c++,使用欧几里得算法计算两个数的最大公约数,分别用递推和递归两种算法实现5

合集下载

求最大公约数(GCD)的两种算法

求最大公约数(GCD)的两种算法

求最⼤公约数(GCD)的两种算法之前⼀直只知道欧⼏⾥得辗转相除法,今天学习了⼀下另外⼀种、在处理⼤数时更优秀的算法——Stein特此记载1.欧⼏⾥得(Euclid)算法⼜称辗转相除法,依据定理gcd(a,b)=gcd(b,a%b)实现过程演⽰: sample:gcd(15,10)=gcd(10,5)=gcd(5,0)=5C语⾔实现:1int Euclid_GCD(int a, int b)2 {3return b?Euclid_GCD(b, a%b):a;4 }2.Stein 算法⼀般实际应⽤中的整数很少会超过64位(当然现在已经允许128位了),对于这样的整数,计算两个数之间的模是很简单的。

对于字长为32位的平台,计算两个不超过32位的整数的模,只需要⼀个指令周期,⽽计算64位以下的整数模,也不过⼏个周期⽽已。

但是对于更⼤的素数,这样的计算过程就不得不由⽤户来设计,为了计算两个超过 64位的整数的模,⽤户也许不得不采⽤类似于多位数除法⼿算过程中的试商法,这个过程不但复杂,⽽且消耗了很多CPU时间。

对于现代密码算法,要求计算 128位以上的素数的情况⽐⽐皆是,设计这样的程序迫切希望能够抛弃除法和取模。

依据定理:gcd(a,a)=a,也就是⼀个数和其⾃⾝的公约数仍是其⾃⾝。

gcd(ka,kb)=k*gcd(a,b),也就是运算和倍乘运算可以交换。

特殊地,当k=2时,说明两个偶数的必然能被2整除。

当k与b互为质数,gcd(ka,b)=gcd(a,b),也就是约掉两个数中只有其中⼀个含有的因⼦不影响。

特殊地,当k=2时,说明计算⼀个偶数和⼀个奇数的时,可以先将偶数除以2。

C语⾔实现:1int Stein_GCD(int x, int y)2 {3if (x == 0) return y;4if (y == 0) return x;5if (x % 2 == 0 && y % 2 == 0)6return2 * Stein_GCD(x >> 1, y >> 1);7else if (x % 2 == 0)8return Stein_GCD(x >> 1, y);9else if (y % 2 == 0)10return Stein_GCD(x, y >> 1);11else12return Stein_GCD(min(x, y), fabs(x - y));13 }。

关于C语言求两个数的最大公约数

关于C语言求两个数的最大公约数

关于C语⾔求两个数的最⼤公约数
⼀、求两个数的最⼤公约数有两种⽅法
1、求差法
对于传⼊的两个数,⽤较⼤的数减去较⼩的数,然后拿差与较⼩的数相⽐,若是相等,则这个数就是最⼤公约数。

否则,对于差和较⼩的数再次重复上述的过程。

关于算法,则可利⽤while的循环来重复或者利⽤递归算法,这⾥采⽤递归来求解
1int division(int n,int m)
2 {
3if(n<m)
4 division(m,n); //交换n,m的值
5else if(n==m)
6return n;
7else
8 {
9int temp=n;
10 n=m;
11 m=temp-n;
12 division(n,m); //重复上述过程
13 }
14 }
2、求模法
求模法就是对于传⼊的两个数,⽤较⼤的数来对较⼩的数求模,要是模为零,则较⼤的数则为最⼤公约数。

若是模不为零,则对于较⼩的数和模继续上述的过程。

此过程与上述的求差法⼏乎⼀模⼀样,仍利⽤递归法.
1int division(int n,int m)
2 {
3if(n<m)
4 division(m,n); //交换m与n
5else if(m==0)
6return n;
7else
8 {
9int temp=n;
10 n=m;
11 m=temp%n;
12 division(n,m); //重复上述过程
13 }
14 }
对于最⼩公倍数,则是两数相乘,然后除以最⼤公约数。

求两个整数m,n的最大公约数的欧几里德算法

求两个整数m,n的最大公约数的欧几里德算法

求两个整数m,n的最大公约数的欧几里德算法
欧几里德算法,也称辗转相除法,是一种求两个数的最大公约数的算法。

方法如下:设a和b是两个不全为0的整数,求它们的最大公约数。

不妨设a > b,用a除以b,得到余数r,将b除以r,得到余数r1,将r除以r1,得到余数r2,如此继续进行,每次将所得的商作为除数,余数作为被除数,直到余数为0为止,此时所得的被除数即为a和b的最大公约数。

可以通过递归来实现欧几里德算法。

例如,假设有两个整数m和n,我们可以使用如下Python代码来实现欧几里德算法:
def gcd(m, n):
if n == 0:
return m
else:
return gcd(n, m % n)
在这个函数中,如果n等于0,则返回m,否则通过递归调用gcd(n, m % n)来继续求解。

这个算法的正确性可以通过数学归纳法来证明。

首先,当n等于0时,gcd(m, n)等于m,显然成立。

接下来,假设gcd(n, m % n)等于d,则gcd(m, n)等于gcd(n, m % n)等于d,也就是说,d是m和n的公因数。

另一方面,如果x是m和n的公因数,则它也是n和m % n的公因数。

因此,d是m和n的最大公因数。

欧几里德算法的时间复杂度为O(log(max(m, n))),因为每一次递归都能将一个参数减半。

因此,这个算法在实践中是非常高效的。

总之,欧几里德算法是求两个数的最大公约数的一种简单而优美的方法,递归实现更容易理解和实现,且在时间复杂度上表现出色,因此在实际应用中被广泛使用。

使用递归求两个数字的最大公约数.

使用递归求两个数字的最大公约数.

使用递归求两个数字的最大公约数.文章主题:使用递归求两个数字的最大公约数在数学中,最大公约数(Greatest Common Divisor,简称GCD)指的是能整除两个或多个整数的最大正整数。

求最大公约数的方法多种多样,其中使用递归是一种常见且优雅的方式。

通过递归,我们可以简洁地表达求解最大公约数的过程,使得代码更加优雅和易读。

下面我们将以递归的方式来讨论如何求两个数字的最大公约数,并深入探讨递归的原理和应用。

一、递归的基本原理及应用递归,顾名思义,就是函数自己调用自己的过程。

在数学和计算机科学中,递归通常用于解决可以被分解为相似子问题的问题。

通过递归调用,我们可以简洁地解决复杂的问题,如斐波那契数列的求解、二叉树的遍历等。

在求两个数字的最大公约数时,我们也可以利用递归的思想,将问题不断分解为相似的子问题,直至求解出最终结果。

在递归调用中,需要考虑递归的终止条件,即递归的边界条件,以避免出现死循环或无限递归的情况。

一般来说,递归调用需要满足递归边界条件,才能够最终退出递归的循环。

二、使用递归求解最大公约数的思路假设我们要求两个数字a和b的最大公约数,我们可以利用欧几里得算法(Euclidean algorithm)来求解。

欧几里得算法的原理是,两个整数的最大公约数等于其中较小的数和两数相除所得余数的最大公约数。

我们可以通过递归的方式来应用欧几里得算法。

具体来说,我们首先比较a和b的大小,如果a小于b,则交换两个数字的位置,确保a始终大于等于b。

我们计算a除以b的余数,将b和余数作为新的两个数字,再次递归调用自己,直至余数为0。

此时,b即为所求的最大公约数。

三、具体实现下面我们给出使用递归求解最大公约数的具体实现。

```pythondef gcd(a, b):if b == 0:return aelse:return gcd(b, a % b)以上代码中,我们定义了一个名为gcd的函数,接受两个参数a和b。

用欧几里得算法求两个自然数的最大公约数c语言

用欧几里得算法求两个自然数的最大公约数c语言

用欧几里得算法求两个自然数的最大公约数c语言
欧几里得算法是一种求解两个自然数最大公约数的有效方法。

该算法的基本思想是利用辗转相除的方式,将两个自然数不断地做除法运算,直到余数为零为止。

在实现该算法时,可以使用递归或循环的方式。

以下是使用C语言实现欧几里得算法求解两个自然数最大公约数的代码示例:
```c
#include <stdio.h>
int gcd(int a, int b) {
if (b == 0)
return a;
else
return gcd(b, a % b);
}
int main() {
int a, b, result;
printf('请输入两个自然数:');
scanf('%d%d', &a, &b);
result = gcd(a, b);
printf('最大公约数为:%d', result);
return 0;
}
```
在该代码中,定义了一个名为gcd的函数,用于实现欧几里得算法。

该函数的参数a和b分别表示两个自然数,函数返回值为它们的最大公约数。

在函数中,首先判断b是否为零,如果是则返回a,否则将b与a%b的结果作为参数递归调用gcd函数。

在main函数中,通过scanf函数获取用户输入的两个自然数,并调用gcd函数求解它们的最大公约数,最后使用printf函数输出结果。

使用函数求最大公约数c语言

使用函数求最大公约数c语言

使用函数求最大公约数c语言最大公约数(Greatest Common Divisor,缩写为GCD)在数学中是一个非常重要的概念。

它可以用于许多问题,如简化分数、判断两个数是否互质等。

在计算机编程中,求两个数的最大公约数是一项基本任务。

本文将介绍使用C语言编写函数来计算最大公约数的方法。

最大公约数的定义最大公约数(GCD)是两个或更多个整数的最大公因数。

两个数的公因数是能够同时整除两个数的因数,而最大公因数就是其中最大的一个。

例如:12和18的公因数为1、2、3和6,其中6是最大的公因数,因此12和18的最大公约数为6。

如果两个数没有公因数,那么它们的最大公约数为1,即它们是互质的。

求解最大公约数的方法有多种方法可以求解最大公约数,下面将介绍其中两种常见的方法。

方法一:欧几里得算法欧几里得算法,也称辗转相除法,是一种古老的算法,用于求解两个数的最大公约数。

它的基本思想是将两个数中的较大数除以较小数得到余数,然后将较小数和余数作为新的一组数,再进行相同的操作,直到余数为0为止。

此时最大公约数即为较小数。

例如,求解56和48的最大公约数,可以按照如下步骤进行:1.用56除以48,得余数8,将8和原来的除数48作为新的一组数;2.用48除以8,得余数0,此时除数8即为所求的最大公约数。

该算法的C语言实现如下:int gcd(int a, int b){if(b == 0)return a;return gcd(b, a % b);}方法二:质因数分解法质因数分解法是另一种常用的求解最大公约数的方法。

它的基本思想是将两个数分解为质数的乘积,然后将它们的公因数相乘,得到的积即为最大公约数。

例如,求解24和36的最大公约数,可以按照如下步骤进行:1. 24的质因数分解为2*2*2*3;2. 36的质因数分解为2*2*3*3;3.将它们的公因数相乘,得到的积为2*2*3=12,即为所求的最大公约数。

该算法的C语言实现如下:int gcd(int a, int b){int i, gcd = 1;for(i = 2; i <= a && i <= b; i++){if(a % i == 0 && b % i == 0){gcd *= i;a /= i;b /= i;i = 1;}}return gcd;}函数实现使用函数求解最大公约数的好处是可以将求解的代码封装在一个函数中,方便重复调用。

C语言实现求最大公约数的三种方法

C语言实现求最大公约数的三种方法

C语⾔实现求最⼤公约数的三种⽅法⽬录题⽬描述问题分析代码实现⽅法⼀:穷举法⽅法⼆:辗转相除法⽅法三:更相减损法题⽬描述求任意两个正整数的最⼤公约数问题分析最⼤公因数,也称最⼤公约数、最⼤公因⼦,指两个或多个整数共有约数中最⼤的⼀个。

a,b的最⼤公约数记为(a,b),同样的,a,b,c的最⼤公约数记为(a,b,c),多个整数的最⼤公约数也有同样的记号。

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

与最⼤公约数相对应的概念是最⼩公倍数,a,b的最⼩公倍数记为[a,b]。

——百度百科最⼤公因数的求法有不少,本⽂我将采⽤穷举法、辗转相除法、更相减损法三种⽅法,求两个正整数的最⼤公约数(最⼤公因数)。

代码实现⽅法⼀:穷举法穷举法(列举法),是最简单最直观的⼀种⽅法。

具体步骤为:先求出两个数的最⼩值min(最⼤公约数⼀定⼩于等于两个数的最⼩值),接着从最⼩值min递减遍历(循环结束条件为i > 0),如果遇到⼀个数同时为这两个整数的因数,则使⽤break退出遍历(退出循环),这时的遍历值i即为两个正整数的最⼤公约数。

123 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23#include <stdio.h>/*** @brief 获取两个正整数的最⼤公因数(穷举法) * @param num1 第⼀个正整数* @param num2 第⼆个正整数* @return 最⼤公因数*/int Get_Max_Comm_Divisor(int num1, int num2) {int i = 0;//获取两个整数的最⼩值int min = num1 < num2 ? num1 : num2;//从两个数的最⼩值开始递减遍历for(i = min; i > 0; i--){//i为num1和num2的公倍数if(num1 % i == 0 && num2 % i == 0)break;}return i;}2425262728293031int main(){int num1 = 0, num2 = 0;puts("请输⼊两个正整数.");scanf("%d%d", &num1, &num2); printf("最⼤公约数为%d.\n", Get_Max_Comm_Divisor(num1, num2)); return 0;}运⾏结果⽅法⼆:辗转相除法辗转相除法⼜称欧⼏⾥得算法,是指⽤于计算两个⾮负整数a ,b 的最⼤公约数。

C语言最大公约数与最小公倍数

C语言最大公约数与最小公倍数

C语言最大公约数与最小公倍数在C语言中,可以使用欧几里得算法(辗转相除法)来计算两个数的最大公约数(GCD),然后使用最大公约数和两数乘积的关系计算最小公倍数(LCM)。

#include <stdio.h>// 定义辗转相除法函数,计算最大公约数int gcd(int a, int b) {if (b == 0) {return a;} else {return gcd(b, a % b);}}// 计算最小公倍数,使用最大公约数和两数乘积的关系int lcm(int a, int b) {return (a * b) / gcd(a, b);}int main() {int num1, num2;printf("请输入两个整数:");scanf("%d %d", &num1, &num2);printf("最大公约数为:%d\n", gcd(num1, num2));printf("最小公倍数为:%d\n", lcm(num1, num2));return 0;}在上述示例中,我们首先定义了辗转相除法的函数gcd,用于计算最大公约数。

然后,我们使用最大公约数和两数乘积的关系,定义了计算最小公倍数的函数lcm最后,我们在main函数中从用户输入读取两个整数,并调用gcd和lcm函数计算最大公约数和最小公倍数,并将结果打印输出。

示例程序的输出如下:请输入两个整数:18 24最大公约数为:6最小公倍数为:72在这个例子中,我们输入了两个整数18和24。

程序计算出它们的最大公约数为6,最小公倍数为72。

c++中求两个数的最大公约数题目

c++中求两个数的最大公约数题目

【题目】C++中求两个数的最大公约数在C++编程中,求两个数的最大公约数是一个常见的问题。

最大公约数,即两个数共有的约数中最大的一个,是数学中常见的概念。

在C++中,我们可以通过多种方法来求解最大公约数,比如欧几里得算法、更相减损术或辗转相除法等。

下面,我将从简单到复杂、由浅入深地介绍这些方法,以及它们的实现原理和应用。

1. 欧几里得算法欧几里得算法,也称辗转相除法,是求解两个正整数的最大公约数的经典方法之一。

它的思想非常简单:假设a、b为两个正整数,且a > b,那么a和b的最大公约数等于b和a%b的最大公约数。

在C++中,我们可以使用递归或循环的方式来实现欧几里得算法,代码非常简洁和高效。

2. 更相减损术更相减损术是另一种求解最大公约数的方法,它的思想是不断用较大数减去较小数,直至两数相等为止。

这个相等的数就是最大公约数。

虽然更相减损术在实际应用中效率较低,但它对于理解最大公约数的概念有一定意义。

在C++中,我们也可以编写代码来实现更相减损术,从而加深对最大公约数的理解。

3. 辗转相除法辗转相除法是求解最大公约数最常用的方法之一,也是欧几里得算法的基础。

它的思想是不断用两数中较大的数除以较小的数,然后用较小的数去除余数,直至余数为0为止。

最后一次作除数的这个较小的数就是最大公约数。

在C++中,我们同样可以编写代码来实现辗转相除法,这也是C++中求最大公约数的常见做法。

在实际编写程序时,我们需要考虑输入的合法性、数值的范围、负数的处理等问题。

对于大整数的最大公约数求解,还需要考虑算法的效率和优化。

在C++中求解最大公约数并不是一件简单的任务,需要我们深入理解相关的数学知识和算法原理,才能编写出高效和稳定的代码。

总结回顾通过以上的介绍,我们对C++中求两个数的最大公约数这一主题有了更深入的理解。

我们学习了欧几里得算法、更相减损术和辗转相除法这三种常见的方法,并深入探讨了它们的实现原理和应用场景。

使用辗转相除法和递归求两个正整数m和n的最大公约数

使用辗转相除法和递归求两个正整数m和n的最大公约数

使用辗转相除法和递归求两个正整数m和n的最大
公约数
1. 使用辗转相除法求解最大公约数:
辗转相除法又叫欧几里得算法,基本思想是用一个数除另一个数取余数,再用除数除余数取余数,如此继续,直到余数为零。

此时,除数就是最大公约数。

具体步骤:
1)设m为较大的数,n为较小的数
2)用m除以n,假设得到的余数为r
3)如果r等于零,说明找到了最大公约数,即n
4)否则,将n赋值给m,将r赋值给n,继续执行步骤2
2. 使用递归求解最大公约数:
递归是一种函数自我调用的方法,通常能够使程序更简洁、直观。

在求最大公约数时,也可以使用递归来实现。

具体步骤:
1)设m为较大的数,n为较小的数
2)如果n等于0,则找到了最大公约数,即m
3)否则,递归调用函数gcd(n, m%n),其中m%n表示m除以n的余数4)重复执行步骤2和3。

求两个正整数的最大公约数c语言程序

求两个正整数的最大公约数c语言程序

求两个正整数的最大公约数c语言程序下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。

文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!寻找两个正整数的最大公约数:一个简单的 C 语言程序在数学中,最大公约数(Greatest Common Divisor,简称 GCD)是两个或多个整数的最大共同因子。

辗转相除法求最大公约数和最小公倍数及其c语言实现

辗转相除法求最大公约数和最小公倍数及其c语言实现

又名欧几里德算法(Euclidean algorithm)乃求两个正整数之最大公因子的算法。

它是已知最古老的算法, 其可追溯至3000年前。

在数学中,辗转相除法,又称欧几里得算法,是求最大公约数的算法。

辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题i 和ii)中,而在中国则可以追溯至东汉出现的《九章算术》。

两个整数的最大公约数是能够同时整除它们的最大的正整数。

辗转相减法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的差的最大公约数。

例如,252和105的最大公约数是21(252 = 21 ×12;105 = 21 × 5);因为252 − 105 = 147,所以147和105的最大公约数也是21。

在这个过程中,较大的数缩小了,所以继续进行同样的计算可以不断缩小这两个数直至其中一个变成零。

这时,所剩下的还没有变成零的数就是两数的最大公约数。

由辗转相除法也可以推出,两数的最大公约数可以用两数的整数倍相加来表示,如21 = 5 ×105 + (−2) × 252。

这个重要的等式叫做贝祖等式。

简单的想法设两数为a、b(a>b),b最大公约数(a,b)的步骤如下:用b除a,得a=bq......r1(0≤r1)。

若r1=0,则(a,b)=b;若r1≠0,则再用r1除b,得b=r1q......r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r2除r1,……如此下去,直到能整除为止。

其最后一个非零除数即为(a,b)。

设两数为a、b(b<a),用gcd(a,b)表示a,b的最大公约数,r=a mod b 为a除以b以后的余数,辗转相除法即是要证明gcd(a,b)=gcd(b,r)。

第一步:令c=gcd(a,b),则设a=mc,b=nc第二步:根据前提可知r =a-kb=mc-knc=(m-kn)c第三步:根据第二步结果可知c也是r的因数第四步:可以断定m-kn与n互素【否则,可设m-kn=xd,n=yd,(d>1),则m=kn+xd=kyd+xd=(ky+x)d,则a=mc=(ky+x)dc,b=nc=ycd,故a与b最大公约数成为cd,而非c】从而可知gcd(b,r)=c,继而gcd(a,b)=gcd(b,r)。

c语言扩展欧几里得算法

c语言扩展欧几里得算法

c语言扩展欧几里得算法扩展欧几里得算法是一种用于求解线性同余方程的算法。

它是欧几里得算法的扩展,可以在求解最大公约数的同时,求出特解使得方程成立。

我们来了解一下线性同余方程。

线性同余方程是指形如ax ≡ b(mod m)的方程,其中a、b、m都是整数,x是未知数。

这种方程在密码学和计算机科学等领域中有广泛的应用。

在解决线性同余方程的过程中,我们经常需要求解两个整数a和b 的最大公约数。

而欧几里得算法就是用来求解最大公约数的经典算法。

欧几里得算法的基本思想是,用除法算法不断地将两个数中较大的数除以较小的数,直到余数为0。

最后一个非零余数就是这两个数的最大公约数。

扩展欧几里得算法在求解最大公约数的同时,还可以求解一个关于a、b的线性方程ax + by = gcd(a, b)的特解。

这个特解可以用来求解线性同余方程的解。

下面我们来看一下扩展欧几里得算法的具体过程。

输入:两个整数a和b,其中a >= b >= 0。

输出:最大公约数gcd(a, b)以及关于a、b的线性方程ax + by =gcd(a, b)的特解x0和y0。

步骤1:如果b等于0,那么gcd(a, b)等于a,特解x0等于1,特解y0等于0。

返回结果。

步骤2:计算a除以b的商q和余数r,即a = bq + r。

步骤3:递归调用扩展欧几里得算法,输入参数为b和r,得到最大公约数d和特解x1和y1。

步骤4:最大公约数d等于x1乘以b加上y1乘以r,即d = x1 * b + y1 * r。

步骤5:特解x0等于y1,特解y0等于x1减去q乘以y1,即x0 = y1,y0 = x1 - q * y1。

步骤6:返回最大公约数d以及特解x0和y0。

通过这个算法,我们可以在求解最大公约数的同时,得到线性同余方程的特解。

这个特解可以用来求解线性同余方程的解集。

扩展欧几里得算法的时间复杂度为O(log(min(a, b))),其中a和b 是输入参数。

c语言求两个数的最大公因数(穷举法,欧几里得算法,递归)

c语言求两个数的最大公因数(穷举法,欧几里得算法,递归)

c语⾔求两个数的最⼤公因数(穷举法,欧⼏⾥得算法,递归)/*主函数Gcd为求公因数的函数输⼊为负时返回-1*/int main(){ int a, b; printf("Input a,b:"); scanf("%d,%d",&a,&b); if (a < 0 || b < 0) printf("Input number should be positive!\n"); else printf("Greatest Common Divisor of %d and %d is %d\n",a,b,Gcd(a,b)); return 0;}/*穷举法⼀(欧⼏⾥得)*/int Gcd(int a,int b){ int i,t; if(a<=0 || b<=0) return -1; t=a<b ? a : b; for(i=t;i>0;i--) { if(a%i==0 && b%i==0)return i; } return 1;}/*穷举法⼆*/int Gcd(int a,int b){ int r; if(a<=0 || b<=0) return -1; do { r=a%b; a=b; b=r; }while(r!=0); return a;}/*递归⼀*/int Gcd(int a,int b){ if(a<=0 || b<=0) return -1; if(a%b==0) return b; else return Gcd(b,a%b);}/*递归⼆是根据公因数的如下性质:根据最⼤公约数的如下3条性质,采⽤递归法编写计算最⼤公约数的函数Gcd(),在主函数中调⽤该函数计算并输出从键盘任意输⼊的两正整数的最⼤公约数。

性质1 如果a>b,则a和b与a-b和b的最⼤公约数相同,即Gcd(a, b) = Gcd(a-b, b)性质2 如果b>a,则a和b与a和b-a的最⼤公约数相同,即Gcd(a, b) = Gcd(a, b-a)性质3 如果a=b,则a和b的最⼤公约数与a值和b值相同,即Gcd(a, b) = a = b*//*⾮递归*/int Gcd(int a, int b){ if (a <= 0 || b <= 0) return -1; while (a != b) { if (a > b) a = a - b; else if (b > a) b = b - a; }return a;}/*递归*/int Gcd(int a,int b){ if(a<=0 || b<=0) return 0; if(a==b) return a; else if(a>b) return Gcd(a-b,b); else return Gcd(a,b-a);}。

原题目:寻找两个数的最大公约数

原题目:寻找两个数的最大公约数

原题目:寻找两个数的最大公约数介绍本文档旨在介绍如何寻找两个数的最大公约数。

最大公约数是指能够同时整除两个数的最大正整数。

方法一:欧几里得算法欧几里得算法(Euclidean Algorithm)是一种基于数学原理的寻找最大公约数的方法。

其基本思想是每次利用两个数的余数来迭代地缩小问题的规模,直到找到最大公约数为止。

以下是欧几里得算法的步骤:1. 选择两个数,分别为a和b。

2. 计算a除以b的余数,记为r。

3. 如果r等于0,则b即为最大公约数。

4. 如果r不等于0,则将b赋值给a,将r赋值给b,然后回到步骤2继续执行。

代码示例def euclidean_algorithm(a, b):while b != 0:r = a % ba = bb = rreturn aa = 24b = 36result = euclidean_algorithm(a, b)print(f"最大公约数为:{result}")方法二:辗转相除法辗转相除法(Division Algorithm)是一种基于整除的寻找最大公约数的方法。

其基本思想是每次用两个数的商来缩小问题的规模,直到找到最大公约数为止。

以下是辗转相除法的步骤:1. 选择两个数,分别为a和b。

2. 计算a除以b的商和余数,记为q和r。

3. 如果r等于0,则b即为最大公约数。

4. 如果r不等于0,则将b赋值给a,将r赋值给b,然后回到步骤2继续执行。

代码示例def division_algorithm(a, b):while b != 0:q = a // br = a % ba = bb = rreturn aa = 24b = 36result = division_algorithm(a, b)print(f"最大公约数为:{result}")结论无论是欧几里得算法还是辗转相除法,都是常用的寻找最大公约数的方法。

使用欧几里得算法计算两个正整数的最大公约数c语言

使用欧几里得算法计算两个正整数的最大公约数c语言

使用欧几里得算法计算两个正整数的最大公约数c语言使用欧几里得算法计算两个正整数的最大公约数是计算机领域中的经典问题之一,尤其在c语言中,这一算法广泛应用。

本文将探讨欧几里得算法的原理和实现方法,并深入介绍在c语言中如何编写代码来实现这一计算过程。

一、欧几里得算法原理欧几里得算法,又称辗转相除法,是一种用于计算两个正整数的最大公约数的算法。

其原理非常简单,即通过反复用较大数除以较小数,然后用除数去除余数,直至余数为0时,除数即为这两个正整数的最大公约数。

二、欧几里得算法实现在c语言中,可以通过递归或迭代的方式来实现欧几里得算法。

下面分别介绍这两种实现方法。

1. 递归实现递归是一种简洁而优雅的解决问题的方式,对于欧几里得算法也同样适用。

以下是c语言中使用递归实现欧几里得算法的代码示例:```cint gcd(int a, int b) {if (b == 0) {return a;} else {return gcd(b, a % b);}}```在这段代码中,函数gcd接受两个正整数参数a和b,返回它们的最大公约数。

当b等于0时,即找到了最大公约数,返回a的值;否则,递归调用gcd函数,传入参数为b和a除以b的余数。

2. 迭代实现除了递归,欧几里得算法还可以通过迭代的方式进行实现。

以下是c语言中使用迭代实现欧几里得算法的代码示例:```cint gcd(int a, int b) {while (b != 0) {int temp = a % b;a = b;b = temp;}return a;}```在这段代码中,使用while循环来不断更新a和b的值,直至b等于0,最终a的值就是这两个正整数的最大公约数。

三、个人观点欧几里得算法作为计算最大公约数的经典算法,不仅在c语言中得到了广泛的应用,也为其他编程语言提供了宝贵的思路。

其简洁、高效的特点使之成为解决相关问题的首选算法之一。

在实际开发中,对欧几里得算法的理解和掌握能够帮助我们更好地应对相关计算问题,提高代码的执行效率和性能。

最大公约数辗转相除法c++

最大公约数辗转相除法c++

最大公约数辗转相除法c++
最大公约数(GCD)是指两个或多个整数的最大公约数。

辗转相除法也称为欧几里得算法,是一种确定两个整数最大公约数的常见方法。

该算法包括不断地取余,直到余数为零为止。

以下是使用C++编写的辗转相除法的示例。

```
#include <iostream>
using namespace std;
int gcd(int a, int b) {
if (b == 0)
return a;
else
return gcd(b, a % b);
}
int main() {
int a, b;
cout << '请输入两个整数:' << endl;
cin >> a >> b;
cout << '它们的最大公约数为:' << gcd(a, b) << endl;
return 0;
}
```
在这个示例中,gcd()函数使用递归来实现辗转相除法。

如果b等于零,则返回a作为最大公约数,否则函数调用自身,并将b和a mod b作为参数传递,直到b等于零。

最后,main()函数将用户输入的两个整数作为参数传递给gcd()函数,并输出它们的最大公约数。

请注意,当a和b非常大时,递归算法可能会导致堆栈溢出。

在这种情况下,可以使用迭代算法来计算最大公约数。

C#实现用欧几里德算法、连续整数检测算法、公因数算法求两个非负整数的最大公约数

C#实现用欧几里德算法、连续整数检测算法、公因数算法求两个非负整数的最大公约数

C#实现⽤欧⼏⾥德算法、连续整数检测算法、公因数算法求两个⾮负整数的最⼤公约数//Main:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace GreatestCommonDivisor{class Program{static void Main(string[] args){Function obj = new Function();while (true){Console.WriteLine("Please choose:");Console.WriteLine("1.Euclid’s Algorithm;");Console.WriteLine("2.Consecutive Integer Detection Algorithm;");Console.WriteLine("mon Divisor Algorithm;");Console.WriteLine("4.Exit;");int number = Convert.ToInt32(Console.ReadLine());Console.WriteLine();Console.WriteLine("Please enter two number:");Console.Write("one:");int one = Convert.ToInt32(Console.ReadLine());Console.WriteLine();Console.Write("another:");int two = Convert.ToInt32(Console.ReadLine());Console.WriteLine();switch (number){case1:Console.Write("Euclid’s Algorithm result:");Console.WriteLine(obj.EuclidAlgorithm(one, two));break;case2:Console.Write("Consecutive Integer Detection Algorithm result:");Console.WriteLine(obj.ConsecutiveIntegerDetectionAlgorithm(one, two));break;case3:Console.Write("Common Divisor Algorithm result:");Console.WriteLine(monDivisorAlgorithm(one, two));break;case4:Environment.Exit(0);break;}}}}}//Class:using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace GreatestCommonDivisor{class Function{///<summary>///欧⼏⾥德算法:///附:(如果两个数都为0.返回0,其中⼀个为0,返回⾮0的数)。

算法怎么就这么难?----使用欧几里得算法求两数的最大公约数

算法怎么就这么难?----使用欧几里得算法求两数的最大公约数

算法怎么就这么难?----使⽤欧⼏⾥得算法求两数的最⼤公约数本⼈菜鸟⼀枚,上午在看书的时候突然看到了求最⼤公约数的⼀个例题,突然就想到以前好像看过⼀个欧⼏⾥得算法,故⼜上⽹仔细找了⼀下欧⼏⾥得算法的原理。

可能是本⼈时间长没看算法,脑⼦都⽣锈了。

看了⼏个讲解欧⼏⾥得算法的⽂章,⼤都只给公式,然后说了⼀⼤堆因为、、、、在我还没看懂的时候,突然来了个所以、、、然后公式就这样推出来的。

⊙﹏⊙b汗!经过我这令⼈捉急的⼩脑袋转了半天,最后有了点眉⽬,所以拿出来和⼤家分享⼀下!1.⾸先说⼀下:欧⼏⾥得算法是求两个数的最⼤公约数的,你可能会问:什么是最⼤公约数?(⊙﹏⊙我在⼀开始看到这个问题的时候,我就突然脑⼦短路,竟然不知道最⼤公约数是什么了)最⼤公约数:即能够同时被两个数整除的那个最⼤的数。

例如:8是16和8的公约数,因为16%8和8%8都等于零嘛!但4也是啊!所以两个数的公约数会有很多,但我们要找出那个最⼤的!2.让我们来使⽤算式分析⼀下,假设求x和y的最⼤公约数。

a).先假设x>y,x和y的最⼤公约数⽤f(x,y)表⽰b).假设 x/y = a;x%y = b;所以:a*y + b = x(这个应该能看出来,因为a为x除以y的整数部分,b为x除以y的余数部分,所以a*y + b = x)将上⾯那个式⼦调换⼀下位置得到:b = x – a*y;因为x和y都能够被f(x,y)整除 -----因为f(x,y)是x和y的最⼤公约数嘛所以 b 也能够被f(x,y)整除 -----即x和y的最⼤公约数f(x,y),它也是b的约数,所以求x和y的最⼤公约数也就相当于求y和b的最⼤公约数。

(你可能会问,为什么本来求x和y的最⼤公约数,最后转了半天变成了求y的b的公约数了?因为 y < x嘛,⽽且x%y肯定也⼩于y,所以,这样⼀来,我们就把求最⼤公约数的范围缩⼩了啊)所以、欧⼏⾥得的公式也就是这么来的f(x,y) = f(y,x%y);所以这个算法的实现也就是不停的迭代,直到找出了x%y等于0时,则停⽌迭代,那个时候最⼤公约数也就是y了(因为x%y都等于0了,所以x和y的最⼤公约数也就是y本⾝了)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验九
一、实验内容
教材3.9 定义递归函数实现下面的Ackman函数
n+1 m=0
Acm(m,n)= Acm(m-1,1) n=0
Acm(m-1,Acm(m,n-1)) n>0,m>0
教材3.10 用递归法实现勒让德多项式:
1 n=0
Pn= x n=1
((2n-1)xPn-1(x)-(n-1)Pn-2(x))/n
教程p24 使用欧几里得算法计算两个数的最大公约数,分别用递推和递归两种算法实现
教程p26 编程:将上题以多文件方式组织,在area.h中声明各个area()函数原型,在area.cpp文件中定义函数,然后在Exp9_2中包含area.h,定义main()
函数并执行。

二、实验目的
1、掌握函数的嵌套调用好递归调用
2、掌握递归算法
3、了解内联函数、重载函数、带默认参函数的定义及使用方法
4、掌握程序的多文件组织
5、掌握编译预处理的内容,理解带参数宏定义与函数的区别
三、实验步骤
教材3.9 定义递归函数实现下面的Ackman函数
n+1 m=0
Acm(m,n)= Acm(m-1,1) n=0
Acm(m-1,Acm(m,n-1)) n>0,m>0
教材3.10用递归法实现勒让德多项式:
1 n=0
Pn= x n=1
((2n-1)xPn-1(x)-(n-1)Pn-2(x))/n
教程p24 使用欧几里得算法计算两个数的最大公约数,分别用递推和递归两种算法实现
教程p26 编程:将上题以多文件方式组织,在area.h中声明各个area()函数原型,在area.cpp文件中定义函数,然后在Exp9_2中包含area.h,定义main()
函数并执行。

四、实验数据及处理结果
#include<iostream>
using namespace std;
int Acm(int m,int n){
if(m==0) return n+1;
else{
if(n==0) return Acm(m-1,1);
else return Acm(m-1,Acm(m,n-1));
}
int main(){
int a,b;
cout<<"please imput two numbers:"<<endl;
cin>>a>>b;
cout<<"Acm(a,b)="<<Acm(a,b)<<endl;
return 0;
}
教材3.10
#include<iostream>
using namespace std;
double P(int n,double x){
if(n==0) return 1;
if(n==1) return x;
return ((2*n-1)*x*P(n-1,x)-(n-1)*P(n-2,x))/n;
}
int main(){
cout<<"P(4,1.5)="<<P(4,1.5)<<endl;
}
教程p24
实验八(2)递推法
#include<iostream>
using namespace std;
int max(int x,int y){
return(x>=y?x:y);
}
int min(int a,int b){
return(a<=b?a:b);
}
int main(){
int a,b,c,d,n;
cout<<"Please imput tow numbers"<<endl;
cin>>a>>b;
c=max(a,b);
d=min(a,b);
n=c%d;
while(n!=0){
c=d;
d=n;
n=c%d;
}
cout<<"最大公约数是"<<d<<endl;
return 0;
}
递归法:
#include <iostream>
using namespace std;
int fun(int x, int y){
if (x%y==0) return y;
else return fun(y, x%y);
}
int main( ){
int m, n, t, r;
cout<<"please imput two numbers"<<endl;
cin>>m>>n;
if(m<n) {
t=m; m=n; n=t;
}
r=fun(m, n);
cout<<"最大公约数是:"<<r<<endl;
return 0;
}
教材p26
area.h
double area(double radius=0);
double area(double a,double b);
double area(double a,double b,double h); double area(double a,double b,double c,int);
area.cpp
#include<cmath>
#define PI 3.14159
double area(double radius){
return PI *radius*radius;
}
double area(double a,double b){
return a*b;
}
double area(double a,double b,double h){ return (0.5*(a+b)*h);
}
double area(double a,double b,double c,int){ double s=0.5*(a+b+c);
return sqrt(s*(s-a)*(s-b)*(s-c));
}
exp9_2.cpp
#include<iostream>
#include<cmath>
#include"area.h"
using namespace std;
#define PI 3.14159
int main(){
cout<<"Area of point is"<<area()<<'\n';
cout<<"Area of square is"<<area(1,1)<<'\n';
cout<<"Area of trapezium is"<<area(1,0.5,1)<<'\n';
cout<<"Area of triangle is"<<area(1,sqrt(1+0.5*0.5),sqrt(1+0.5*0.5),0)<<'\n';
return 0;
}
五、思考讨论题或体会或对改进实验的建议
感觉对多文件运行结构不是很透彻,运用多文件方式与不运用是否有什么区别?。

相关文档
最新文档