c语言递归实现最大公约数源码

合集下载

如何用c语言求最大公约数和最小公倍数

如何用c语言求最大公约数和最小公倍数

在这种方法里,先做除数的,后一步就成了被除数,这就是辗转相除法名字的来历吧。
int gcd( int n, int m )
{
if( m == 0 ) return n;
return gcd( m, n % m );
}
呵呵,够简单吧!
这个是辗转相除t a,b;
a=g_cd(m,n);
if (m>n) //最小公倍数=较大的数*(较小的数/最大公约数)
{
b=n;
b/=a;
return m*b;
}
else
{
b=m;
b/=a;
return n*b;
}
}
main()
}
else printf("Error!\n");
return 0;
}
★ 关于辗转相除法, 搜了一下, 在我国古代的《九章算术》中就有记载,现摘录如下:
约分术曰:“可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。”
其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法,实际上就是辗转相除法。
否则 n 为最大公约数
<2> 最小公倍数 = 两个数的积 / 最大公约数
#include
int main()
{
int m, n;
int m_cup, n_cup, res; /*被除数, 除数, 余数*/
printf("Enter two integer:\n");

c语言求两个数最大公约数,穷举法的时间复杂度

c语言求两个数最大公约数,穷举法的时间复杂度

c语言求两个数最大公约数,穷举法的时间复杂度C语言求两个数最大公约数,穷举法的时间复杂度在计算机科学领域中,我们经常需要解决各种数学问题,例如求两个数的最大公约数。

而在C语言中,我们可以使用穷举法(也称为暴力法)来求解最大公约数。

在本篇文章中,我们将深入探讨C语言中求两个数最大公约数的问题,并分析穷举法的时间复杂度。

1. 最大公约数的概念最大公约数指的是两个或多个整数共有约数中最大的一个。

在数学上,常用的求最大公约数的方法有辗转相除法、更相减损术和质因数分解法等。

而在计算机科学中,我们可以使用穷举法来求解最大公约数。

下面,我们将以C语言为例,介绍如何使用穷举法来求解两个数的最大公约数。

2. C语言求最大公约数在C语言中,我们可以使用穷举法来求解两个数的最大公约数。

穷举法的基本思路是从较小的数开始,逐渐减小,直到找到两个数的一个公约数为止。

以下是一个简单的C语言程序示例:```c#include <stdio.h>int gcd(int a, int b) {int min = a < b ? a : b;int max = a > b ? a : b;int result = 0;for (int i = 1; i <= min; i++) {if (min % i == 0 && max % i == 0) {result = i;}}return result;}int main() {int a, b;printf("请输入两个整数:");scanf("%d %d", &a, &b);printf("它们的最大公约数是:%d\n", gcd(a, b)); return 0;}```3. 穷举法的时间复杂度穷举法的时间复杂度可以通过一个简单的分析得出。

在上面的C语言程序中,我们使用了一个for循环来进行穷举。

c语言 最大公约数和最小公倍数

c语言 最大公约数和最小公倍数

c语言最大公约数和最小公倍数最大公约数和最小公倍数是数学中常用的概念,也是在编程中经常需要用到的知识点。

在C语言中,我们可以通过简单的算法来计算两个数的最大公约数和最小公倍数。

首先,让我们来了解一下最大公约数和最小公倍数的定义。

最大公约数,又称为最大公因数,是指两个或多个整数共有的约数中最大的一个。

最小公倍数,又称为最小公倍数,是指能够被两个或多个整数同时整除的最小的一个数。

接下来,我们分别介绍如何计算最大公约数和最小公倍数的算法。

1.最大公约数的计算:最大公约数有多种计算方法,这里我们介绍常用的欧几里得算法。

欧几里得算法,也叫辗转相除法,基于以下原理:-如果a能被b整除,那么a和b的最大公约数是b;-如果a不能被b整除,那么a和b的最大公约数等于b和a除以b的余数的最大公约数。

根据这个原理,我们可以用递归的方式来实现最大公约数的计算。

代码如下:```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的余数,直到b等于0。

2.最小公倍数的计算:最小公倍数可以通过最大公约数来计算。

根据以下公式可以得到最小公倍数:最小公倍数= (a * b) /最大公约数(a, b)可以编写一个函数来计算最小公倍数,代码如下:```cint lcm(int a, int b) {int gcdVal = gcd(a, b);return (a * b) / gcdVal;}```这段代码中的lcm函数用于计算a和b的最小公倍数。

它首先调用gcd函数来计算a和b的最大公约数,然后用a和b的乘积除以最大公约数得到最小公倍数。

以上就是计算最大公约数和最小公倍数的算法。

在C语言中,我们可以使用这些算法来方便地计算任意两个整数的最大公约数和最小公倍数。

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

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

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

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

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

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

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

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

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

#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;}int main(){int num1 = 0, num2 = 0;puts("请输⼊两个正整数.");scanf("%d%d", &num1, &num2);printf("最⼤公约数为%d.\n", Get_Max_Comm_Divisor(num1, num2));运⾏结果⽅法⼆:辗转相除法辗转相除法⼜称欧⼏⾥得算法,是指⽤于计算两个⾮负整数a,b的最⼤公约数。

详解C语言求两个数的最大公约数及最小公倍数的方法

详解C语言求两个数的最大公约数及最小公倍数的方法

详解C语⾔求两个数的最⼤公约数及最⼩公倍数的⽅法求两个正整数的最⼤公约数思路:这是⼀个很基本的问题,最常见的就是两种⽅法,辗转相除法和辗转相减法。

通式分别为 f(x, y) = f(y, x%y), f(x, y) = f(y, x - y) (x >=y > 0)。

根据通式写出算法不难,这⾥就不给出了。

这⾥给出《编程之美》上的算法,主要是为了减少迭代的次数。

对于x和y,如果y = k * y1, x= k * x1,那么f(x, y) = k * f(x1, y1)。

另外,如果x = p * x1,假设p为素数,并且y % p != 0,那么f(x, y) = f(p * x1, y) = f(x1, y)。

取p = 2。

参考代码://函数功能: 求最⼤公约数//函数参数: x,y为两个数//返回值: 最⼤公约数int gcd_solution1(int x, int y){if(y == 0)return x;else if(x < y)return gcd_solution1(y, x);else{if(x&1) //x是奇数{if(y&1) //y是奇数return gcd_solution1(y, x-y);else //y是偶数return gcd_solution1(x, y>>1);}else //x是偶数{if(y&1) //y是奇数return gcd_solution1(x>>1, y);else //y是偶数return gcd_solution1(x>>1, y>>1) << 1;}}}求最⼩公倍数:最常⽤的是辗转相除法,有两整数a和b:① a%b得余数c②若c=0,则b即为两数的最⼤公约数③若c≠0,则a=b,b=c,再回去执⾏①下⾯⾮递归版本:int gcd_solution2(int x, int y){int result = 1;while(y){int t = x;if(x&1){if(y&1){x = y;y = t % y;}elsey >>= 1;}else{if(y&1)x >>= 1;else{x >>= 1;y >>= 1;result <<= 1; }}}return result * x; }。

【C语言程序设计】C语言求最大公约数(详解版)!

【C语言程序设计】C语言求最大公约数(详解版)!

【C语⾔程序设计】C语⾔求最⼤公约数(详解版)!问题描述求任意两个正整数的最⼤公约数(GCD)。

问题分析如果有⼀个⾃然数a能被⾃然数b整除,则称a为b的倍数,b为a的约数。

⼏个⾃然数公有的约数,叫做这⼏个⾃然数的公约数。

公约数中最⼤的⼀个公约数,称为这⼏个⾃然数的最⼤公约数。

根据约数的定义可知,某个数的所有约数必不⼤于这个数本⾝,⼏个⾃然数的最⼤公约数必不⼤于其中任何⼀个数。

要求任意两个正整数的最⼤公约数即求出⼀个不⼤于其中两者中的任何⼀个,但⼜能同时整除两个整数的最⼤⾃然数。

算法设计思路有两种:第⼀种:采⽤穷举法按从⼩到⼤(初值为1,最⼤值为两个整数当中较⼩的数)的顺序将所有满⾜条件的公约数列出,输出其中最⼤的⼀个;第⼆种,按照从⼤(两个整数中较⼩的数)到⼩(到最⼩的整数1)的顺序求出第⼀个能同时整除两个整数的⾃然数,即为所求。

我们将对第⼆种思路进⾏详细说明。

两个数的最⼤公约数有可能是其中的⼩数,所以在按从⼤到⼩顺序找寻最⼤公约数时,循环变量i的初值从⼩数n开始依次递减,去寻找第⼀个能同时整除两整数的⾃然数,并将其输出。

需要注意的是,虽然判定条件是i>0,但在找到第⼀个满⾜条件的i值后,循环没必要继续下去;如,25和15,最⼤公约数是5,对于后⾯的4、3、2、1没必要再去执⾏,但此时判定条件仍然成⽴,要结束循环只能借助break语句。

程序流程图:下⾯是完整的代码:#include<stdio.h>int main(){int m, n, temp, i;printf("Input m & n:");scanf("%d%d", &m, &n);if(m<n) /*⽐较⼤⼩,使得m中存储⼤数,n中存储⼩数*/{ /*交换m和n的值*/temp=m;m=n;n=temp;}for(i=n; i>0; i--) /*按照从⼤到⼩的顺序寻找满⾜条件的⾃然数*/if(m%i==0 && n%i==0){/*输出满⾜条件的⾃然数并结束循环*/printf("The GCD of %d and %d is: %d\n", m, n, i);break;}return0;}运⾏结果:Input m & n:100 125The GCD of 125 and 100 is: 25不管你是转⾏也好,初学也罢,进阶也可,如果你想学编程,进阶程序员~【值得关注】我的!【点击进⼊】全栈程序员正在等你加⼊~。

c语言输出最大公约数和最小公倍数

《C 语言输出最大公约数和最小公倍数》在 C 语言编程中,计算最大公约数和最小公倍数是非常常见的需求之一。

它们是数学中的基本概念,对于计算机科学以及实际问题中都具有重要的意义。

本文将深入探讨如何在 C 语言中输出最大公约数和最小公倍数,并结合实际问题进行分析和应用。

## 1. 最大公约数让我们明确最大公约数的定义。

最大公约数,英文为 Greatest Common Divisor,通常缩写为 GCD,是两个整数的共同约数中最大的一个。

在 C 语言中,我们可以使用欧几里得算法来高效地计算两个数的最大公约数。

欧几里得算法的基本思想是通过不断取余的方式,直到余数为 0,那么除数就是最大公约数。

以下是 C 语言中计算最大公约数的代码示例:```cint gcd(int a, int b) {if (b == 0) {return a;} else {return gcd(b, a % b);}}```在上述代码中,我们定义了一个名为 `gcd` 的函数,它接收两个整数参数 `a` 和 `b`,然后通过递归调用自身来计算最大公约数。

这种递归的实现思路非常巧妙,而且在实际的程序中也能够高效地运行。

## 2. 最小公倍数接下来,让我们来讨论最小公倍数。

最小公倍数,英文为 Least Common Multiple,通常缩写为 LCM,是两个整数的共同倍数中最小的一个。

在C 语言中,我们可以通过最大公约数来计算最小公倍数,因为有一个基本的性质:两个整数的最大公约数与它们的最小公倍数的乘积等于这两个整数的乘积。

以下是 C 语言中计算最小公倍数的代码示例:```cint lcm(int a, int b) {return a / gcd(a, b) * b;}```在上述代码中,我们定义了一个名为 `lcm` 的函数,用来计算两个整数的最小公倍数。

通过调用之前我们定义的 `gcd` 函数,可以非常方便地实现对最小公倍数的计算。

c语言程序设计-求两个数最大公约数

1写两个函数,分别求两个整数的最大公约数和最小公倍数,用主函数调用这两个函数, 并输出结果。

这两个数由键盘输入。

程序设计:#include<stdio.h>int hcf(int x,int y){int t;if(xvy){t=x;x=y;y=t;} while((t=x%y)!=0){x=y;y=t;}return y;} int lcf(int x,int y,int m){return x*y/m;}int main(){int hcf(int,int);int lcf(int,int,int);int x,y,h,l;printf("请输入两个数:"); scanf("%d%d",&x,& y);h=hcf(x,y);l=lcf(x,y,h);printf("最大公约数为:h=%d\n最小公倍数为:l=%d\n",h,l); return 0; }运行结果:2求方程ax A2+bx+c=0的根,用3个函数分别求当:b A2-4ac大于0、等于0和小于0时的根并输出结果。

从主函数输入a,b, c的值。

程序设计:#include<stdio.h>#include<math.h>void g_two(double a,double b,double c) {double x1,x2;x1=(-b+sqrt(b*b-4*a*c))/(2*a); x2=(-b-sqrt(b*b-4*a*c))/(2*a);printf("方程的两个根为:x仁%f\nx2=%f\n",x1,x2); }void g_one(double a,double b,double c){double x;x=(-b)/(2*a);printf("方程的两个根为:x1=x2=%f\n",x);}void g_zone(double a,double b,double c){printf("无解\n");}void main(){void g_two(double,double,double);void g_one(double,double,double);void g_zone(double,double,double); double a,b,c,t;printf("请输入a、b、c 的值:"); scanf("%lf%lf%lf", &a,&b,& c); t=b*b-4*a*c;if(t>0)g_two(a,b,c);else if(t==0)g_one(a,b,c);elseg_zone(a,b,c);}运行结果:3.写一个判断素数的函数,在主函数输入一个整数,输出是否是素数的信息。

利用递归求两个数的最大公约数(利用辗转相除法)

利用递归求两个数的最大公约数(利用辗转相除法)最大公约数,也叫做最大公因数,是指两个或多个整数共有的约数中最大的一个。

求两个数的最大公约数可以使用递归方法,特别是采用辗转相除法。

所谓辗转相除法,是指通过不断地用较小的数去除较大的数,然后再用除数去除余数,直到最后余数为0为止。

最后一个不为0的除数即为最大公约数。

下面我们就来看一个具体的例子,以便更好地理解递归求解最大公约数的方法。

假设我们要求解的两个数是36和48。

首先,我们使用48去除36,得到余数为12。

然后,将36作为新的被除数,余数12作为新的除数,再进行一次相除操作。

我们用36去除12,得到余数0。

此时,我们得到的不为0的除数12就是最大公约数。

我们可以使用递归方法来实现这个过程。

首先,设定递归函数gcd(a, b)表示求解a和b的最大公约数。

如果b等于0,那么gcd(a, b)就等于a;如果b不等于0,那么gcd(a, b)等于gcd(b, a%b)。

这样,我们就可以利用递归不断地缩小问题规模,直到规模最小为止。

接下来,我们将上述方法转化为函数的形式,方便我们进行编程实现。

```pythondef gcd(a, b):if b == 0:return aelse:return gcd(b, a % b)```在调用这个函数时,我们只需要传入要求解的两个数即可。

```pythonresult = gcd(36, 48)print("36和48的最大公约数为:" + str(result))```通过以上步骤,我们成功地求解出了36和48的最大公约数,即12。

这个方法不仅仅适用于36和48,对于任意两个正整数,我们都可以采用相同的方法求解它们的最大公约数。

在实际应用中,求解最大公约数经常用于简化分数、约分、化简等操作。

比如,在算术题中,我们需要将一个分数化简为最简形式,就需要求解其分子和分母的最大公约数,然后将分子和分母都除以这个最大公约数,得到最简形式的分数。

c语言中用递归法求两个数的最大公约数

c语言中用递归法求两个数的最大公约数
在C语言中,可以使用递归方法来求两个数的最大公约数(Greatest Common Divisor, GCD)。

这里给出一个基于欧几里得算法(Euclidean Algorithm)的递归实现:
```c
#include <stdio.h>
int gcd(int a, int b) {
// 基本情况:如果b为0,则a是最大公约数
if (b == 0)
return a;
// 递归情况:应用性质1或性质2
else
return gcd(b, a % b);
}
int main() {
int x, y;
printf("请输入两个整数: ");
scanf("%d %d", &x, &y);
printf("所输入两数的最大公约数为: %d\n", gcd(x, y));
return 0;
}
```
在这个程序中,`gcd()`函数接收两个参数 `a` 和 `b`。

它首先检查基本情况,即当 `b` 为0时返回 `a` 作为最大公约数。

否则,它会递归地调用自身,将 `b` 和 `a` 对 `b` 取模的结果作为新的参数。

这个过程会一直持续下去,直到达到基本情况为止。

这种递归实现利用了欧几里得算法的基本原理:对于任何两个正整数 `a` 和 `b`,它们的最大公约数与 `b` 和`a` 除以 `b` 的余数的最大公约数相同。

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