汇编程序:求两个正整数的最大公约数
求两个正整数最大公约数
求两个正整数最大公约数
作者:程冬蕊
来源:《教育周报·教研版》2017年第25期
一、“更相减损之术”来历
《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,即"可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。
以等数约之。
"
翻译成现代语言如下:
第一步:任意给定两个正整数;判断它们是否都是偶数。
若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。
继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
其中所说的"等数",就是最大公约数。
求"等数"的办法是"更相减损"法。
第一步"可半者半之"是指分子分母皆为偶数的时候,首先用2约简。
加入这一步的原因可能是,分母、分子皆为偶数是在分数加减运算的结果中比较容易遇到的一种情况,用这种方法有可能减少数字的位数,简化计算。
当然,省略这个以2约简的步骤,也能得到正确的答案。
二、“更相减损之术”理论
理论依据:两个正整数:可知与有相同的约数,即两个整数的最大公约数等于其中较小的数和两数之差的最大公约数,继续这样的运算,不断缩小两数,直到产生一对相等的数,这就是最大公约数。
三、“更相减损之术”算法表示与程序框图。
输入两个正整数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,不断用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个整数的最小公倍数。
最大公约数函数的实现思路:
1. 根据欧几里得算法,两个数的最大公约数等于其中较小的数和两数相除余数的最大公约数。
2. 使用递归实现最大公约数函数。
3. 当其中一个数为0时,返回另一个数;否则,递归调用函数,将较小的数和两数相除余数作为参数传入。
最小公倍数函数的实现思路:
1. 两个数的最小公倍数等于两数之积除以它们的最大公约数。
2. 调用最大公约数函数求出两个数的最大公约数。
3. 最小公倍数等于两数之积除以它们的最大公约数。
4. 使用整数除法时需要将其中一个数转换成浮点数,以避免丢失精度。
- 1 -。
输入两个正整数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语言程序设计-求两个数最大公约数
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++中,我们可以通过多种方法来求解最大公约数,比如欧几里得算法、更相减损术或辗转相除法等。
下面,我将从简单到复杂、由浅入深地介绍这些方法,以及它们的实现原理和应用。
1. 欧几里得算法欧几里得算法,也称辗转相除法,是求解两个正整数的最大公约数的经典方法之一。
它的思想非常简单:假设a、b为两个正整数,且a > b,那么a和b的最大公约数等于b和a%b的最大公约数。
在C++中,我们可以使用递归或循环的方式来实现欧几里得算法,代码非常简洁和高效。
2. 更相减损术更相减损术是另一种求解最大公约数的方法,它的思想是不断用较大数减去较小数,直至两数相等为止。
这个相等的数就是最大公约数。
虽然更相减损术在实际应用中效率较低,但它对于理解最大公约数的概念有一定意义。
在C++中,我们也可以编写代码来实现更相减损术,从而加深对最大公约数的理解。
3. 辗转相除法辗转相除法是求解最大公约数最常用的方法之一,也是欧几里得算法的基础。
它的思想是不断用两数中较大的数除以较小的数,然后用较小的数去除余数,直至余数为0为止。
最后一次作除数的这个较小的数就是最大公约数。
在C++中,我们同样可以编写代码来实现辗转相除法,这也是C++中求最大公约数的常见做法。
在实际编写程序时,我们需要考虑输入的合法性、数值的范围、负数的处理等问题。
对于大整数的最大公约数求解,还需要考虑算法的效率和优化。
在C++中求解最大公约数并不是一件简单的任务,需要我们深入理解相关的数学知识和算法原理,才能编写出高效和稳定的代码。
总结回顾通过以上的介绍,我们对C++中求两个数的最大公约数这一主题有了更深入的理解。
我们学习了欧几里得算法、更相减损术和辗转相除法这三种常见的方法,并深入探讨了它们的实现原理和应用场景。
输入两个正整数m和n,求最小公倍数,与最大公约数
第一周作业1输入两个正整数m和n, 求其最大公约数和最小公倍数.<1> 用辗转相除法求最大公约数算法描述: m对n求余为a, 若a不等于0 则m <- n, n <- a, 继续求余否则n 为最大公约数<2> 最小公倍数= 两个数的积/ 最大公约数#include int main(){int m, n; int m_cup, n_cup, res; /*被除数, 除数, 余数*/ printf("Enter two integer:\n");scanf("%d %d", &m, &n);if (m > 0 && n >0){m_cup = m;n_cup = n;res = m_cup % n_cup;while (res != 0){m_cup = n_cup;n_cup = res;res = m_cup % n_cup;}2、分别用三种循环语句(while语句、do-while语句、for语句),实现求1~100的累加和。
第2周的题目:(要求用数组做)printf("Greatest common divisor: %d\n", n_cup);printf("Lease common multiple : %d\n", m * n / n_cup);}else printf("Error!\n");return 0;}2int sum = 0;int i=0;while(i<100){sum += (i+1);i++;}printf("%d" , sum);i=0;do{sum += (i+1);i++;}while(i <=100)printf("%d" , sum);for(i = 1 ; i <=100 ; i++){sum += i;}printf("%d" , sum);第二周作业1用冒泡法对输入的10个整数排序。
求两个正整数的最大公约数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语言使用欧几里得算法计算两个正整数的最大公约数是计算机领域中的经典问题之一,尤其在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 语⾔求两个正整数的最⼤公约数⽰例代码⽬录前⾔1.穷举法2.欧⼏⾥得算法(辗转相除法)3.递归⽅法附:相减法总结前⾔两个正整数的最⼤公约数(Greatest Common Divisor, GCD )是能够整除这两个整数的最⼤整数。
两个正整数的最⼤公约数的求法有多种解答,本⽂就三种⽅法做详细介绍:穷举法、欧⼏⾥得算法(辗转相除法)、递归⽅法。
我们从⼀道问题来引⼊:编写计算最⼤公约数的函数Gcd(),在主函数中调⽤该函数计算并输出从键盘任意输⼊的最⼤公约数。
1.穷举法根据最⼤公约数的定义,我们可以采⽤⼀种最简单的⽅法——穷举法来编写代码。
由于a 和b 的最⼤公约数不可能⽐a 和b 中的较⼩者还⼤,否则⼀定不能整除它,因此,先找到a 和b 中的较⼩者t ,然后从t 开始逐次减1尝试每种可能,即检验t 到1之间的所有整数,第⼀个满⾜公约数条件的t ,就是a 和b 的最⼤公约数。
据此我们可编写函数Gcd()如下:12345678910111213//函数功能:计算a 和b 的最⼤公约数,输⼊负数时返回-1int 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;}这种⽅法简单暴⼒,思维量⼩,但效率较低,且当两个正整数都较⼤,且最⼤公约数为1时,循环的次数为较⼩数的值,可想⽽知所需时间会很长。
2.欧⼏⾥得算法(辗转相除法)下⾯介绍⼀种求最⼤公约数较常⽤的办法:欧⼏⾥得算法(辗转相除法)。
忽略数学原理,我们有如下算法:对正整数a 和b ,连续进⾏求余运算,直到余数为0为⽌,此时⾮0的除数就是最⼤公约数。
设 r=a mod b 表⽰a 除以b 的余数,若 r≠0 ,则将b 作为新的a ,r 作为新的b ,重复 a mod b 运算,直到 r=0 为⽌,此时b 为所求的最⼤公约数。
原题目:寻找两个数的最大公约数
原题目:寻找两个数的最大公约数介绍本文档旨在介绍如何寻找两个数的最大公约数。
最大公约数是指能够同时整除两个数的最大正整数。
方法一:欧几里得算法欧几里得算法(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}")结论无论是欧几里得算法还是辗转相除法,都是常用的寻找最大公约数的方法。
编程题15_用函数求最大公约数
if (m<=0||n<=0)
cout<<"error input.\n";
else
{
r=Gcd(m,n);
cout<<"Gcd="<<r<<",Lcm="<<m*n/r<<endl;
}
return 0;
}
参考源代码仅供老师参考,不要添加到系统中
允许的编程语言:选g++-3.3,
在保存并预览之后,点开:“测试用例”选项卡,再选择下方的“添加”,加入3组测试用例
见测试用例显示
参考源程序代码
注意:本题可以用书上的方法5-11来做
下面的答案给出不同的求解方法。
#include<iostream>
using Βιβλιοθήκη amespace std;/*方法一:递归
int Gcd(int m,int n)
选g33名称和描述两项请将文档第二列内容对应贴入系统中测试用例请各位自己添加题目的最后已有描述每个题目也说明了要给几组测试用例其他选项可以自行设定例如开启时间结束时间等等需要大家逐步熟悉
名称
编程题15:用函数求最大公约数。
备注
描述
编写函数Gcd求两个正整数的最大公约数,将此公约数返回。主函数中读入两个正整数m和n,调用Gcd函数,求m和n的最大公约数和最小公倍数.
{
int r;
r=m%n;
if (!r)
return n;
else
return Gcd(n,r);
}*/
/*方法二:迭代*/
Python自定义函数实现求两个数最大公约数、最小公倍数示例
Python⾃定义函数实现求两个数最⼤公约数、最⼩公倍数⽰例本⽂实例讲述了Python⾃定义函数实现求两个数最⼤公约数、最⼩公倍数。
分享给⼤家供⼤家参考,具体如下:1. 求最⼩公倍数的算法:最⼩公倍数 = 两个整数的乘积 / 最⼤公约数所以我们⾸先要求出两个整数的最⼤公约数, 求两个数的最⼤公约数思路如下:2. 求最⼤公约数算法:①整数A对整数B进⾏取整, 余数⽤整数C来表⽰举例: C = A % B②如果C等于0,则C就是整数A和整数B的最⼤公约数③如果C不等于0, 将B赋值给A, 将C赋值给B ,然后进⾏ 1, 2 两步,直到余数为0, 则可以得知最⼤公约数3. 程序代码实现如下:#!/usr/bin/env python# coding:utf-8def fun(num1, num2): # 定义⼀个函数, 两个形参if num1 < num2: # 判读两个整数的⼤⼩,⽬的为了将⼤的数作为除数,⼩的作为被除数num1, num2 = num2, num1 # 如果if条件满⾜,则进⾏值的交换vari1 = num1 * num2 # 计算出两个整数的乘积,⽅便后⾯计算最⼩公倍数vari2 = num1 % num2 # 对2个整数进⾏取余数while vari2 != 0: # 判断余数是否为0, 如果不为0,则进⼊循环num1 = num2 # 重新进⾏赋值,进⾏下次计算num2 = vari2vari2 = num1 % num2 # 对重新赋值后的两个整数取余数# 直到 vari2 等于0,得到最到公约数就退出循环vari1 /= num2 # 得出最⼩公倍数print("最⼤公约数为:%d" % num2) # 输出print("最⼩公倍数为:%d" % vari1) # 输出fun(6, 9)运⾏结果:最⼤公约数为:3最⼩公倍数为:18运⾏结果截图:PS:这⾥再为⼤家推荐⼀款本站相关在线⼯具供⼤家参考:更多关于Python相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》及《》希望本⽂所述对⼤家Python程序设计有所帮助。