求两个正整数的最大公因数和最小公倍数

  • 两个正整数最大公因数和最小公倍数的关系
  • 更相减损术
    • 原理:
    • 代码实现:
  • 辗转相除法
    • 原理:
    • 代码实现:
  • 穷举法
    • 原理:
    • 代码实现:
  • Stein算法
    • 原理:
      • 两数都为偶数
      • 两数一奇一偶
      • 两数都为奇数
    • 代码实现:

今天做作业做到了一道求解两个数最大公因数的题,突然想总结一下求解的思路(目前为止自己知道的),那就开始吧。

两个正整数最大公因数和最小公倍数的关系

最小公倍数除以最大公因数等于两数之积
直接上图:

因此我们只要会求两个数的最大公因数,就可以很容易得到最小公倍数了,因此接下来我们主要求两个数的最大公因数

更相减损术

原理:

对于两个数91、168,设它们的最大公因数为m,则91,168都能被m整除(整除,即91%m==0),168-91=77,所以168可以写成91+77,91可以被m整除,所以77也能被m整除,因此可以转换为求91和77的最大公因数,再把91写成77+14,说明14也能被m整除,转换为求14和77的最大公因数,这样一直下去,最后转换为求14和7的最大公因数,再把14写成7+7,也就是求7和7的最大公因数,那就是7咯,写成算式就是:
168-91=77
91-77=14
77-14=63
63-14=49
49-14=35
35-14=21
21-14=7
14-7=7

代码实现:

#include<stdio.h>
int main()
{int m, n;scanf("%d%d", &m, &n);int tmp = 0;//创建一个临时变量,用作m,n交换时的中间变量while (n){if (m < n)//如果m<n,交换两个数的值{tmp = m;m = n;n = tmp;}n = m - n;m = m - n;}printf("%d", m);
}

结合着图片看,就会发现先令n=m-n,再令m=m-n,就相当于把m-n的值赋给n,把原来n的值赋给m,也就和我们上面的算式对应起来了

辗转相除法

原理:

辗转相除法原理与更相减损术原理相似,给定两个数168和91,168%91=77,就相当于168减去了一倍的91,91%77=14,就相当于91减去了一倍的77,77%14=7,相当于减去了5倍的14,相当于把五步和为一步!14%7=0,就说明最终结果就是7,结合上面更相减损数的转换思路理解!

代码实现:

#include<stdio.h>
int main()
{int m, n,tmp=0;scanf("%d%d", &m, &n);while (n > 0){tmp= m % n;m = n;n = tmp;}printf("%d", m);return 0;
}

这种方法与上面的方法原理相似,理解了上面的这个就不算难理解,而且这个算法会节约一些时间,但是为什么这里不需要判断m<n的特殊情况?因为当m<n时,tmp=m%n就相当于tmp=m,而再加上m=n,n=tmp,就相当于交换了m,n的值

穷举法

原理:

对于两个数m,n的最大公因数,一定小于等于m,n中较小的那一个,我们只需从m,n中较小的数开始循环,找到第一个能整除m和n的那个数,即为最大公因数

代码实现:

#include<stdio.h>
int main()
{int m, n;scanf("%d%d", &m, &n);int min = m > n ? m : n;//复习一下三目操作符int i = 0;for ( i = min; i >= 1; i--){if (m % i == 0 && n % i == 0){break;//一旦找到公因数就跳出循环,即为最大公因数}}printf("%d", i);
}

Stein算法

原理:

大事化小
首先引进一个符号:gcd是greatest common divisor(最大公约数)的缩写,gcd( x,y ) 表示x和y的最大公约数。根据x,y的奇偶性我们可以进行转换。
下面三种情况中x,y均为奇数

两数都为偶数

则gcd( 2x , 2y )=gcd( x , y )*2
这个很容易明白

两数一奇一偶

y为奇数,所以y的所有因数都是奇数,所以二者的公因数也只能是奇数,所以gcd( 2x, y )=gcd( x , y )

两数都为奇数

这种情况乍一看没什么可以化小的方法,但是两个奇数的和、差都为偶数,这又引起我们的遐想!假设x>y

所以我们得到gcd( x,y )=gcd( (x+y)/2 ,(x-y)/2 )

那么接下来我们就可以把一个gcd( x , y )根据不同的情况化小,以求得答案

代码实现:

x&1表示x与1进行位运算,如果x&1=1,则x为奇数(建议复习一下&运算)

int Stein(int x,int y)
{int m= 0,tmp=0;if(x<y){tmp=y;y=x;x=tmp;}while(x!=y){if(x&1){if(y&1)//x,y同为奇数时{y = (x-y)>>1;//右移一位,即y=(x-y)/2x -= y;//即x=x-y}else//x为奇数,y为偶数时,这里x本就大于y,y/2后也必定大于y{y>>=1;//即y=y/2}}else{if(y&1)//x为偶数,y为奇数{x>>=1;if(x<y) //虽然x>y,但x/2后有可能小于y,再判断一次{tmp=y;y=x;x=tmp;}}else//x,y都为偶数{x>>=1;y>>=1;m++;}}}return x<<m;//因为x,y同除以2后,最大公因数变为原来的一半,所以返回最大公因数时应该乘回来,而其它情况下x,y变化,最大公因数不变
}
int main()
{int x,y;scanf("%d%d",&x,&y);int gcd= Stein(x,y);//接收最大公因数printf("%d\n",gcd);return 0;
}

比如说我们代入168和91:

这其实和我们的递归思想有些相似,实际上这种算法也有递归写法,你可以试试哦!

求两个正整数的最大公因数和最小公倍数相关推荐

  1. c语言两个正整数的最小公倍数,C语言求两个正整数的最小公倍数

    这里将介绍求两个正整数的最小公倍数(Least Common Multiple,LCM)的方法.提供两种主要思路,一种是直接根据最小公倍数的定义设计算法,一种是由最大公约数计算得出.下面来介绍这两种方 ...

  2. php怎么求最小公倍数,C++_详解C语言求两个数的最大公约数及最小公倍数的方法,求两个正整数的最大公约数nbs - phpStudy...

    详解C语言求两个数的最大公约数及最小公倍数的方法 求两个正整数的最大公约数 思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法.通式分别为 f(x, y) = f(y, x%y) ...

  3. 三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数

    第二次作业 题目:求两个正整数的最大公约数和最小公倍数. 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出. 提高要求:1.三种以上算法解决两个正整 ...

  4. 求两个正整数的最大公约数和最小公倍数

    基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出. 提高要求:1.三种以上算法解决两个正整数最大公约数问题. 2.求3个正整数的最大公约数和最小公倍 ...

  5. C语言求两个正整数的最小公倍数

    这里将介绍求两个正整数的最小公倍数(Least Common Multiple,LCM)的方法.提供两种主要思路,一种是直接根据最小公倍数的定义设计算法,一种是由最大公约数计算得出.下面来介绍这两种方 ...

  6. 求两个正整数的最小公倍数

    Java语言程序设计(基础篇) 编程综合题 6.29 求最小公倍数 编写程序,提示用户输入两个整数并求它们的最小公倍数(LCM). 两个数的最小公倍数是指这两书的倍数中最小的数. 例如, 8和12的最 ...

  7. 【经典100题】 题目16 求两个数的最大公约数和最小公倍数

    题目 求两个数的最大公约数和最小公倍数. 最大公约数:指两个或多个整数共有约数中最大的一个 最小公倍数:指两个或多个整数共有倍数中最小的一个 说明:自己没有搞清楚最大公约数和最小公倍数的定义,结果走了 ...

  8. c语言求出两个最大素数,求两个正整数的最大公约数      思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法。通式分别为 f(x, y) = f(y, x%y...

    求两个正整数的最大公约数 思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法.通式分别为 f(x, y) = f(y, x%y), f(x, y) = f(y, x - y) ( ...

  9. 百度web前端面试题之求两个数的最大公约数和最小公倍数

    求两个数的最大公约数和最小公倍数,好像是第三题, 找到如下简洁写法: <1> 用辗转相除法求最大公约数 算法描述: m对n求余传给自己,再次求余, 若余数等于0 则 n 为最大公约数 &l ...

最新文章

  1. Java 初始化顺序
  2. 自定义控件详解(三):Canvas效果变换
  3. x86、amd64、x86-64、x64以及ia64的基本概念
  4. Android安卓程序开发的权限设置
  5. c# list 自定义排序
  6. 05_SpringCloud整合声明式HTTP客户端-Feign
  7. 笔记本电脑风扇声音大_笔记本风扇噪音太大?教你怎么降低笔记本风扇噪音
  8. 回调机制在 Android 监听用户界面操作中的体现
  9. 瀑布流的布局(功能还没有完善)
  10. BOW(opencv源码)
  11. 国产操作系统中标麒麟v6
  12. chrome浏览器Flash版本过低解决方法
  13. oracle 白鳝 row cache lock,ROW CACHE LOCK导致数据库CPU高案例分析
  14. 97年小伙“最牛简历”刷屏:面子算什么,我只想搞钱
  15. Python调用Matplotlib绘制分布点图
  16. linux 进程带宽限制,如何限制网络带宽在Linux上
  17. 如何开启Windows共享文件夹服务
  18. java实现微信小程序获取手机号(htts接口实现)
  19. 像FIFA一样踢球的AI,比打游戏更强吗?
  20. BSGSexBSGS(让你轻松理解和掌握)

热门文章

  1. 关于经济学的几个经典故事
  2. 《推理的迷宫》读书笔记之二
  3. 发信息服务器恢复,手机短信删除了怎么恢复?看完恢复原理你就懂了!
  4. LVGL——PC模拟器仿真模拟+VS2017
  5. 神经网络模型优化方法(缓解过拟合)
  6. 取模运算性质_取模运算的性质
  7. 深度学习中的 Batch_Size的作用
  8. php 模糊文件名链接,推荐10款模糊处理源码(收藏)
  9. 计算机伦理学论文,WebQuest在社会与职业道德(计算机伦理学)课程中的教学应用研究...
  10. 微信公众平台自带的生成公众号二维码的连接