汇编程序:求两个正整数的最大公约数

合集下载

求两个正整数最大公约数

求两个正整数最大公约数

求两个正整数最大公约数
作者:程冬蕊
来源:《教育周报·教研版》2017年第25期
一、“更相减损之术”来历
《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,即"可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。

以等数约之。

"
翻译成现代语言如下:
第一步:任意给定两个正整数;判断它们是否都是偶数。

若是,则用2约简;若不是则执行第二步。

第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。

继续这个操作,直到所得的减数和差相等为止。

则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。

其中所说的"等数",就是最大公约数。

求"等数"的办法是"更相减损"法。

第一步"可半者半之"是指分子分母皆为偶数的时候,首先用2约简。

加入这一步的原因可能是,分母、分子皆为偶数是在分数加减运算的结果中比较容易遇到的一种情况,用这种方法有可能减少数字的位数,简化计算。

当然,省略这个以2约简的步骤,也能得到正确的答案。

二、“更相减损之术”理论
理论依据:两个正整数:可知与有相同的约数,即两个整数的最大公约数等于其中较小的数和两数之差的最大公约数,继续这样的运算,不断缩小两数,直到产生一对相等的数,这就是最大公约数。

三、“更相减损之术”算法表示与程序框图。

输入两个正整数m和n,求其最大公约数和最小公倍数

输入两个正整数m和n,求其最大公约数和最小公倍数

输入两个正整数m和n,求其最大公约数和最小公倍数最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。

求两个正整数m和n的最大公约数可用欧几里德算法(辗转相除法)。

求两个正整数m和n的最小公倍数=两个数的乘积÷两个数的最大公约数。

用欧几里德算法(辗转相除法)求两个数的最大公约数的步骤如下:先用小的一个数除大的一个数,得第一个余数;再用第一个余数除小的一个数,得第二个余数;又用第二个余数除第一个余数,得第三个余数;这样逐次用后一个数去除前一个余数,直到余数是0为止。

那么,最后一个除数就是所求的最大公约数(如果最后的除数是1,那么原来的两个数是互质数)。

两个正整数的最小公倍数=两个数的乘积÷两个数的最大公约数。

由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。

这就是说,求两个数的最小公倍数,可以先求出两个数的最大公约数,再用这两个数的最大公约数去除这两个数的积,所得的商就是两个数的最小公倍数。

main(){int p,r,n,m,temp;printf("Please enter 2 numbers n,m:");scanf("%d,%d",&n,&m);//输入两个正整数.if(n\u003cm)//把大数放在n中,把小数放在m中. {temp=n;n=m;m=temp;}p=n*m;//P是原来两个数n,m的乘积.while(m!=0)//求两个数n,m的最大公约数.{r=n%m;n=m;m=r;}printf("Its MAXGongYueShu:%d\\n",n);//打印最大公约数. printf("Its MINGongBeiShu:%d\\n",p/n);打印最小公倍数.。

输入两个正整数m和n,求其最大公约数和最小公倍数+欧几里得算法

输入两个正整数m和n,求其最大公约数和最小公倍数+欧几里得算法

输入两个正整数m和n,求其最大公约数和最小公倍数+欧几里得算法
欧几里得算法,又称辗转相除法,是求最大公约数的一种常用算法。

假设有两个正整数m和n,且m>n,不断用n去除m,直到余数为0,此时n的值即为m和n的最大公约数。

最小公倍数是指在自然数中,同时整除两个数的最小正整数,可以通过最大公约数求得:
两个数的最小公倍数 = 两数积÷ 最大公约数。

下面是Python代码实现:
```
m = int(input("请输入第一个正整数m:"))
n = int(input("请输入第二个正整数n:"))
# 求最大公约数
while (n != 0):
r = m % n
m = n
n = r
gcd = m
# 求最小公倍数
lcm = int((m * n) / gcd)
print("最大公约数是:", gcd)
print("最小公倍数是:", lcm)
```
输入:
```
请输入第一个正整数m:12
请输入第二个正整数n:18 ```
输出:
```
最大公约数是: 6
最小公倍数是: 36
```。

题目描述 编写2个函数,求2个整数的最大公约数和最小公倍数。

题目描述 编写2个函数,求2个整数的最大公约数和最小公倍数。

题目描述编写2个函数,求2个整数的最大公约数和最小公
倍数。

编写2个函数,一个用于求2个整数的最大公约数,一个用于求2个整数的最小公倍数。

最大公约数函数的实现思路:
1. 根据欧几里得算法,两个数的最大公约数等于其中较小的数和两数相除余数的最大公约数。

2. 使用递归实现最大公约数函数。

3. 当其中一个数为0时,返回另一个数;否则,递归调用函数,将较小的数和两数相除余数作为参数传入。

最小公倍数函数的实现思路:
1. 两个数的最小公倍数等于两数之积除以它们的最大公约数。

2. 调用最大公约数函数求出两个数的最大公约数。

3. 最小公倍数等于两数之积除以它们的最大公约数。

4. 使用整数除法时需要将其中一个数转换成浮点数,以避免丢失精度。

- 1 -。

输入两个正整数m和n,求其最大公约数和最小公倍数

输入两个正整数m和n,求其最大公约数和最小公倍数

输⼊两个正整数m和n,求其最⼤公约数和最⼩公倍数题⽬:输⼊两个正整数m和n,求其最⼤公约数和最⼩公倍数。

程序分析:利⽤辗除法。

在循环中,只要除数不等于0,⽤较⼤数除以较⼩的数,将⼩的⼀个数作为下⼀轮循环的⼤数,取得的余数作为下⼀轮循环的较⼩的数,如此循环直到较⼩的数的值为0,返回较⼤的数,此数即为最⼩公约数,最⼩公倍数为两数之积除以最⼩公倍数。

1package com.li.FiftyAlgorthm;23import java.util.Scanner;45/**b6 * 题⽬:输⼊两个正整数m和n,求其最⼤公约数和最⼩公倍数。

程序分析:利⽤辗除法。

7 * 在循环中,只要除数不等于0,⽤较⼤数除以较⼩的数,将⼩的⼀个数作为下⼀轮循环的⼤数,取得的余数作为下⼀轮循环的较⼩的数,如此循环直到较⼩的数的值为0,返回8 * 较⼤的数,此数即为最⼩公约数,最⼩公倍数为两数之积除以最⼩公倍数。

9 *10 * @author yejin11 *12*/13public class CommonDiviser {14public static void main(String[] args) {15int a, b;16 Scanner s1 = new Scanner(System.in);17 Scanner s2 = new Scanner(System.in);18 a = s1.nextInt();19 b = s2.nextInt();20 CommonDiviser cd = new CommonDiviser();21int m = cd.division(a, b);22int n = a * b / m;23 System.out.println("最⼤公约数: " + m);24 System.out.println("最⼩公倍数: " + n);25 }2627public int division(int x, int y) {28int t;29if (x < y) {30 t = x;31 x = y;32 y = t;33 }3435while (y != 0) {36if (x == y)37return 1;38else {39int k = x % y;40 x = y;41 y = k;42 }43 }44return x;45 }46 }。

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

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++中求两个数的最大公约数在C++编程中,求两个数的最大公约数是一个常见的问题。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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