更相减损术:可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。

使用步骤:

第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。(可以不除,结果相应的也不乘约去的2)

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

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

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

方法一:严格按照定义走

#include<stdio.h>
#include<math.h>
int main() {//更相减损术(定义版)int m, n;int cnt = 0;//记录折半次数 scanf("%d %d", &m, &n);//同为偶数,则折半(除2) while (m % 2 == 0 && n % 2 == 0) {m /= 2;n /= 2;cnt++;}//m等于n,最大公约数就是他们本身 //m不等于n,开始循环相减 while (m != n) {if (m > n)m -= n;elsen -= m;}m *= pow(2, cnt);//乘上约去的2printf("最大公约数:%d\n", m);return 0;
}

方法二:省略折半

#include<stdio.h>
#include<math.h>
int main() {//更相减损术(简化版)int m, n;scanf("%d %d", &m, &n);//m等于n,最大公约数就是他们本身 //m不等于n,开始循环相减 while (m != n) {if (m > n)m -= n;elsen -= m;}printf("最大公约数:%d\n", m);return 0;
}

总结:

我们注意到,更相减损术的核心思想就是不断让两个数大减小,直到他们相等为止。其中,如果同时为偶数,就折半,很显然折半后,两数都变得更小方便我们进行减法计算,减小了计算量,最后只需把除掉的2乘回去即可。当然这个步骤可以省略,无需判断奇偶进行折半,直接开始进行大减小的操作,最后是多少就是多少。

求最大公约数(更相减损术)相关推荐

  1. C++ 求最大公约数 更相减损法 欧几里得算法 暴力穷举法

    两个数的最大公约数是指能同时被他们整除的最大正整数. 两个数的最大公约数等于它们中 较小的数 和 两数之差 的最大公约数. 252和105的最大公约数是21(252 = 21 × 12:105 = 2 ...

  2. C语言:求最大公约数-更相减损法(循环自定义函数的定义与调用)

    又是王老师的一道练习题: 任务描述 1.任意给定两个正整数:判断它们是否都是偶数.若是,则用2约简:若不是则执行第二步: 2.以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数.继续这 ...

  3. 更相减损术——Java实现

    Java作业--求最大公约数--更相减损术 虽然算法简单,但是因为很不熟练,所以一开始的代码有较多错误,以下是经过多次修改后的代码. 代码: import java.util.Scanner;publ ...

  4. 《九章算术》中更相减损术----求最大公约数

    更相减损法:也叫更相减损术,是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合. #include<stdio.h> in ...

  5. 求最大公约数和最小公倍数——辗转相除法(欧几里得算法)、更相减损术、stein算法

    辗转相除法-- 辗转相除法求最大公约数的原理: 两个整数其中较小的数 和 两数相除(较大数除较小数)的余数(使用递归)的最大公约数. 辗转相除法求最小公倍数的原理: 两个整数分别除以最大公约数的结果相 ...

  6. 使用更相减损术求最大公约数

    package cn.com.test3;import java.util.Scanner;/** 使用更相减损术求最大公约数* 第一步:任意给定两个正整数:判断它们是否都是偶数.若是,则用2约简:若 ...

  7. 求最大公约数(更相减损术辗转相除法)

    求解最大公约数的多种Way: 1 暴力解决法:M不断自减找到最大公约数. 2 辗转相除法:反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数. 3 更相减损术:若两者都为偶数,进行折半,直到 ...

  8. 辗转相除法与更相减损术(求最大公约数)

    辗转相除法:两个正整数a和b(a>b),它们的最大公约数等于a除以b的余数c和b之间的最大公约数.比如10和25,25除以10商2余5,那么10和25的最大公约数,等同于10和5的最大公约数. ...

  9. C语言 用更相减损术求最大公约数,最小公倍数

    更相减损术 更相减损术是出自<九章算术>的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合. 出处 <九章算术> 用途 求最大公约数 作用 ...

最新文章

  1. tensorflow2.0 RNN文本预测
  2. Field creation not permitted in partner development mode
  3. 关于如何安装less
  4. Express框架使用以及数据库公共操作类整理(Win7下的NodeJs)
  5. gdb core 调试(ZZ)
  6. oracle视图和索引,oracle视图和索引
  7. python代码-20个Python代码段,你需要立刻学会,好用到哭!
  8. 解决Emacs输出PDF文件时Tex缺少.sty文件的方法
  9. 论文笔记_S2D.19_2018-PR_基于膨胀卷积神经网络与软加权和推理的分层融合单目深度估计
  10. groupdel 删除用户组
  11. 解决csdn登陆后复制的3种方法
  12. studioOne安装教程与简单使用(图文)
  13. 视频Video放器的部分实例方法
  14. win10系统下xilinx烧写器不亮
  15. Linux的PCI驱动介绍(入门)
  16. ssm+Vue计算机毕业设计学生网上请假系统(程序+LW文档)
  17. python内存地址不变,关于python内存地址问题
  18. PR字幕预设|视频文字闪烁标题闪动特效PR预设
  19. 华为双前置摄像头_华为第一款“刘海屏”手机发布,前置摄像头逆天
  20. python之最大公约数

热门文章

  1. 我为什么选择Rust
  2. 如何为WPF应用程序制作一个虚拟键盘?这里有答案(Part 2)
  3. python计算机图形学_计算机图形学—— 隐藏线和隐藏面的消除(消隐算法)
  4. (基于TI-RSLK)MSP432学习-02-硬件及书籍汇总(中文PDF)
  5. ti移动机器人设计报告
  6. parent-child 关系介绍
  7. 影之刃服务器维护,《影之刃3》2021年3月25日维护公告
  8. C++学习笔记之设计模式
  9. c语言写一个程序有关泰勒公式,泰勒公式求e值——c语言算法实现
  10. REUSE_ALV_GRID_DISPLAY_LVC 实现单元格级别的编辑示例