一、三种方法求两个数的最大公约数

(1) 辗转相除法

辗转相除法求最大公约数是一种常用的求两个数的最大公约数的方法。

方法是:

以小数除大数,如果能整除,那么小数就是所求的最大公约数。否则就用余数来除除数;再用新除法的余数去除刚才的余数。依此类推,直到一个除法能够整除,这时作为除数的数就是所求的最大公约数。

具体过程如下:  输入正整数m和n,保证m不小于n;  如果n≠0,则求r=m%n,然后m=n,n=r;重复此操作直到n=0; 如果n=0,则此时m就是最大公约数(如果最后的除数是1,那么原来的两个数是互质数)。 若要求这两个数的最小公倍数,其值就是这两数之积除以这两数的最大公约数得到的商。

例如求1515和600的最大公约数,

第一次:用600除1515,商2余315;

第二次:用315除600,商1余285;

第三次:用285除315,商1余30;

第四次:用30除285,商9余15;

第五次:用15除30,商2余0.

1515和600的最大公约数是15.

代码实现如下:

#include<stdio.h>

void main()   /*  辗转相除法求最大公约数 */

{

int m, n, a, b, t, c;

printf("请输入两个有效的正整数:\n");

scanf("%d%d", &a, &b);

m=a;

n=b;

while(b!=0)  /* 余数不为0,继续相除,直到余数为0 */

{ c=a%b; a=b;  b=c;}

printf("最大公约数为:%d\n", a);

printf("最小公倍数为:%d\n", m*n/a);

}

程序运行结果截屏如下图:

⑵ 更相减损法

《九章算术》是中国古代的数学专著其中的“更相减损术”可以用来求两个数的最大公约数即“可半者半之不可半者副置分母、子之数以少减多更相减损求其等也。以等数约之。”

翻译成现代语言如下:

第一步任意给定两个正整数,判断它们是否都是偶数。若是则用2约简,若不是则执行第二步。

第二步是以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止,则这个等数就是所求的最大公约数。

其中所说的“等数”就是最大公约数。求“等数”的办法是“更相减损”法 。

简而言之就是有两整数a和b:

① 若a>b,则a=a-b

② 若a<b,则b=b-a

③ 若a=b,则a(或b)即为两数的最大公约数

④ 若a≠b,则再回去运行①

比如用更相减损术求98与63的最大公约数。

解:由于63不是偶数,把98和63以大数减小数,并辗转相减:

98-63=35

63-35=28

35-28=7

28-7=21

21-7=14

14-7=7

所以,98和63的最大公约数等于7。

代码实现如下:

#include<iostream>

using namespace std;

int main()

{

int a,b,g,l;

int gcd(int a,int b);//gcd为英语最大公约数的首字母缩写

int lcm(int a,int b);//lcm即为最小公倍数的缩写

cout<<"请输入两个有效的数字:"<<endl;

cin>>a>>b;

g=gcd(a,b);

l=lcm(a,b);

cout<<"所求的最大公约数为"<<g<<endl;

cout<<"所求的最小公倍数为"<<l<<endl;

return 0;

}

int gcd(int a,int b)//用更相减损法求最大公约数

{

int c;

while(a!=b) //a, b不相等,大数减小数,直到相等为止

{

if(a>b)

{

c=a-b;

a=c;

}

else

{

c=b-a;

b=c;

}

}

return a;

}

int lcm(int a,int b)//最小公倍数等于两数的积除以两数的最大公约数

{

int g,l;

g=gcd(a,b);

l=a*b/g;

return l;

}

程序运行结果截屏如下图:

对于辗转相除法和更相减损法这两种算法都需要用循环结构去实现,从运算形式上去分析比较两种方法的异同优劣,个人认为更相减损术时效性可能更好一些,因为减法比除法更易于操作。但是具体怎样还是需要大量的实践验证。

⑶穷举法

穷举法(也叫枚举法)穷举法求两个正整数的最大公约数的解题步骤:从两个数中较小数开始由大到小列举,直到找到公约数立即中断列举,得到的公约数便是最大公约数 。

对两个正整数a,b如果能在区间[a,0]或[b,0]内能找到一个整数temp能同时被a和b所整除,则temp即为最大公约数。

代码实现为:

#include "stdio.h"

int gcd (int a,int b) /*自定义函数求两数的最大公约数*/

{

int  temp;          /*定义义整型变量*/

temp=(a>b)?b:a;    /*条件运算表达式求出两个数中的最小值*/

while(temp>0)

{

if (a%temp==0&&b%temp==0) /*只要找到一个数能同时被a,b所整除,则中止循环*/

break;

temp--;      /*如不满足if条件则变量自减,直到能被a,b所整除*/

}

return (temp); /*返回满足条件的数到主调函数处*/

}

void main()

{

int m,n,t;

printf("请输入两个数字:");

scanf("%d%d",&m,&n);

t=gcd(m,n);

printf("最大公约数为: %d\n",t);

}

程序运行结果截屏如下图:

 二、求n个数最小公倍数的算法

首先我们要知道,如果有三个正整数a b c,若d是a和b的最小公倍数,e是d和c的最小公倍数,那么e就是a b c的最小公倍数。同理,我们可以推出n个数的最小公倍数的求解,而对于最小公倍数的求解过程我们可以使用一个函数LCM来求解,在此之前我们要明白最小公倍数是如何求解的。若k是a和b的最大公约数,那么a和b的最小公倍数为a*b/k。而对于最大公约数的求解上文中我们有三种方法,最简单的我们可以使用辗转相除法来求得。从而我们可以很快的写出来求最小公倍数的算法,接下来就是要利用数组定义所要求的数字集合,利用循环结构遍历一次数组即可求出n个数的最小公倍数,那么问题就迎刃而解了。
代码实现如下:

#include <stdio.h>

int LCM(int x,int y) //求最小公倍数的算法实现

{

int a,b,c,z;//定义整形变量

a=x;

b=y;

while(y)//辗转相除法求最大公约数的算法

{

z=x%y;

x=y;

y=z;

}

c=a*b/x;//最小公倍数等于数字之积除以它们的最大公约数

return c;//返回值

}

int main()

{

int i=0,lcm,m;//lcm为最小公倍数英文单词的缩写,m表示用户想求得几个数字的最小公倍数

printf("请输入你想求的n个数字的最小公倍数:\n");

scanf("%d",&m);

int a[100];//定义数组表示输入的数字

for(i=0;i<m;i++)//遍历数组

{

scanf("%d",&a[i]);

}

for(i=0;i<m-1;i++)

{

lcm=LCM(a[i],a[i+1]);//依次求数字的最小公倍数

a[i+1]=lcm;

}

printf("您所求的最小公倍数为:%d\n",lcm);

return 0;

}

程序运行结果截屏如下图:

三、作业总结

通过这次上机作业,我看到自己的很多不足之处,首先基础知识不扎实,对以前所学的知识理解得不够深刻,掌握得不够牢固,这是导致自己不能完全完成任务的主要原因,在这过程中,遇到了各种各样的问题,有的解决了,有的尝试了很多次依然解决不了,这让我有些苦恼,信心也受到了打击;其次是逻辑思维不够严密,缺乏创新能力,总是想着用最简单最低级的语句解决所有问题,不能想到很多其他的更好更有效率的解决办法,过程繁琐,拖泥带水,看起来不简洁明了;最后就是工作效率不高,一下午可能只能解决一两个小问题,耗费大量的精力和时间却只能换来一段中等水平的代码。
     这些问题使我正视了自己,自己还有很多很多需要学习的地方。通过这次上机作业,使我更加地体会到多看专业书的重要性,只有掌握了一定量的专业知识才能得心应手地解决诸多问题,另外,在做任何事都要有耐心,不要一遇到困难就退缩,一碰到难解决的问题就跳过,在学习和工作中要时刻谨记“踏实”二字,踏踏实实认认真真学习基础,它好比通向成功的铺路石,不可或缺。
     但也有好处,在这次作业过程中,体现出了自己设计开发的能力以及综合运用知识的能力,体会了学以致用,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。在今后的学习中,我们应该发现自己的不足然后虚心学习,更加完善自己,为今后步入社会参加工作打下足够的基础,更重要的是,要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。
      此次作业设计也让我明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,最后,还要衷心感谢老师耐心的指导和答疑,让我们能够更好更快的解决问题,学习到真正有用的知识。谢谢老师!

三种方法求最大公约数及求n个数的最小公倍数相关推荐

  1. Python:三种方法计算最大公约数和最小公倍数(欧几里德法、穷举法、stein算法)

    Python:三种方法计算最大公约数和最小公倍数 1.穷举法 2.欧几里德法 3.Stein算法 题目:求取任意两个非负数(至多一个数为0)的最大公约数和最小公倍数: 参考资料:Python解决求最大 ...

  2. c语言实现求最大公约数的三种方法

    一.最大公约数 最大公因数,也称最大公约数.最大公因子,指两个或多个整数共有约数中最大的一个.a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也 ...

  3. 三种方法求最大公约数(C语言版)

    问题描述:用三种方法求两个的整数的最大公约数. 算法分析: 1.相减法:输入两整数a和b,(1)如果a>b,a=a-b;(2)如果a<b,b=b-a;(3)如果a=b,a或b就为这两个整数 ...

  4. C++算法:三种方法求最大公约数和最小公倍数

    三种方法求最大公约数和最小公倍数标题 首先明确最大公约数和最小公倍数的关系,设两个数为a,b:最大公约数为c,最大公倍数为d: 则ab=cd;怎么得到的可以通过数学算式证明. 分别用暴力搜索法,辗转相 ...

  5. C语言求最大公约数三种方法详解

    C语言求最大公约数三种方法详解 题目要求 常用写法(穷举法) 辗转相减法 辗转相除法 main函数 整体代码 题目要求 运行最大公约数的常用算法,并进行程序的调式与测试. 常用写法(穷举法) 从两个数 ...

  6. C语言求最大公约数的三种方法

    最大公约数是两个数可以同时整除的数中最大的那个 这里用三种方法来解决 穷举法求最大公约数 判断x和y的最大公约数,x和y其中一定有一个相对较小的数,然后从这个较小数开始遍历,不断地用x和y去除这个数, ...

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

    任意输入两个数,求出二者的最大公约数,以C语言实现.以下是三种方法以及对应思路: <1>辗转相除法. 定义两个变量存放两个数(a,b),先以冒泡法将较大数存放在在b内,较小数存放于a. 相 ...

  8. 求最小公倍数的三种方法(C语言)

    求最小公倍数的三种方法 1.常规暴力求解法 2.辗转相除法 3.迭乘法 //1.常规暴力求解法 #include <stdio.h> int main() {int a = 0;int b ...

  9. C语言求最小公倍数的三种方法

    第一种方法:累加法求 思路是,两个数字,要求他们的最小公倍数,那么这个最小公倍数,至少不要比这两个要求的数小.我们首先判断出两个数中较大的一个,然后判断这个数是否是要求的两个数的最小公倍数.如果不是, ...

最新文章

  1. 如何定义带有可选参数的函数python_Python如何定义有可选参数的元类
  2. jMeter HTTP Request Defaults 的学习笔记
  3. Farseer:一个用于Silverlight和XNA的开源物理引擎
  4. 13个好习惯 教你健康一整年
  5. 在Scala中列出| 关于Scala列表的完整教程
  6. ASPxGridView 结合CheckBox实现多选(在后台事件代码控制)
  7. wlnmp+nginx+mysql+php集合包_LNMP(Linux+Nginx+MySQL+PHP)部署详解(一)
  8. matlab 图像分块及恢复
  9. (免费领)Java大厂面试题: 常见的异常类有哪些?
  10. 徐小凤将现身东方卫视跨年晚会 为63岁庆生
  11. XPS查看器(XPS Viewer)适用Win10系统安装说明
  12. CPU压力测试工具cpuburn
  13. 用华为模拟器ENSP构造校园网(第二天)配置总网络拓扑DHCP中继
  14. 计算机专业bs和cs,BS和CS的区别以及各自的优缺点
  15. 从信息网络安全规则开始之——ISO27001
  16. python版我的世界怎么去天堂_我的世界中国版手游怎么去天堂 我的世界去天堂代码指令...
  17. 纵向时间线html,51个css时间轴
  18. CTSC/APIO2018咕咕记THUPC2018打铁记
  19. Mac系统中移动硬盘热拔(强制退出)后,在插上不显示移动硬盘的问题和解决办法
  20. vue实现页面刷新以及局部刷新的方法

热门文章

  1. 线程及其相关接口函数(Linux)
  2. IMX6ULL 基于NXP官方Linux源码添加自己单板
  3. 基于STM32(HAL库)的水质检测(浑浊度、PH值、温度、手机APP显示、wifi上云)
  4. 如何用python语言解一元二次方程式
  5. 开源RISC-V 项目Freedom在Arty-7-100T开发板上的实现
  6. 20201223:调用paddlepaddle抠图模型更改照片底色
  7. 毕业一年,工作一年,有收获,有失去,有遗憾,但仍一往无前 (征文)
  8. python xlwt表格写入操作
  9. 【GAMES-202实时渲染】3、预计算环境光照(球谐函数(SH)、IBL、Split Sum、环境光阴影计算(PRT))
  10. CE自动汇编之AOB注入