源自:百度百科

辗转相除法

辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法

例如,求(,):
∵ ÷=(余319)
∴(,)=(,);
∵ ÷=(余58)
∴(,)=(,);
∵ ÷=(余29)
∴ (,)=(,);
∵ ÷=(余0)
∴ (,)= ;
∴ (,)=。

用辗转相除法求几个数的最大公约数,可以先求出其中任意两个数的最大公约数,再求这个最大公约数与第三个数的最大公约数,依次求下去,直到最后一个数为止。最后所得的那个最大公约数,就是所有这些数的最大公约数。

更相减损法

第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
其中所说的“等数”,就是最大公约数。求“等数”的办法是“更相减损”法。所以更相减损法也叫等值算法。
例1.用更相减损术求98与63的最大公约数。
解:由于63不是偶数,把98和63以大数减小数,并辗转相减:
-=
-=
-=
-=
-=
-=
所以,98和63的最大公约数等于7。
这个过程可以简单的写为:
(,)=(,)=(,)=(,)=(,)=(,)=(,)=.
例2.用更相减损术求260和104的最大公约数。
解:由于260和104均为偶数,首先用2约简得到130和52,再用2约简得到65和26。
此时65是奇数而26不是奇数,故把65和26辗转相减:
-=
-=
-=
所以,260与104的最大公约数等于13乘以第一步中约掉的两个2,即13**=。
这个过程可以简单地写为:
(,)(//) =>(,)=(,)=(,)=(,)=. (**) => []

比较:

比较辗转相除法与更相减损术的区别
(1)都是求最大公因数的方法,计算上辗转相除法以除法为主,更相减损术以减法为主,计算次数上辗转相除法计算次数相对较少,特别当两个数字大小区别较大时计算次数的区别较明显。
(2)从结果体现形式来看,辗转相除法体现结果是以相除余数为0则得到,而更相减损术则以减数与差相等而得到

代码实现

一:最简单方法

#include <stdio.h>
#include <stdlib.h> int main()
{
int m, n,temp,i;
scanf("%d", &m);
scanf("%d", &n); if (m>n)
{
temp = m;
m = n;
n = temp;
} for (i = m; i >= ;i--)
if (m%i== && n%i==)
break; printf("%d\n", i); system("pause");
return ;
}

二:辗转相除法(递归)

#include <stdio.h>
#include <stdlib.h> int gcd(int a, int b)
{
int mod;
if ((mod = a % b) == 0)
return b;
return gcd(b, mod);
}
int main()
{
int m, n,ret;
scanf("%d", &m);
scanf("%d", &n); ret = gcd(m, n);
printf("%d", ret); system("pause");
return ;
}

三:辗转相除法(非递归)

int gcd(int a, int b)
{
int mod=a % b;
while (mod!=)
{
a = b;
b = mod;
mod = a % b;
}
return b;
}

四:更相减损法(非递归)

#include <stdio.h>
#include <stdlib.h>
#include <math.h> int gcd(int a, int b)
{
int val= a - b;
while (val != b)
{
if (b>val)
{
a = b;
b = val;
}
else
{
a = val;
}
val = a - b;
}
return val;
} int main()
{
int m, n,ret,temp,count=;
scanf("%d", &m);
scanf("%d", &n); if (m == n)
{
printf("%d", m);
return ;
} if (m < n)
{
temp = m;
m = n;
n = temp;
} while (m% == && n% == )
{
count++;
m /= ;
n /= ;
} ret = gcd(m, n);
printf("%d", ret*((int)pow(,count)));  //使用pow需要进行(int)转换,不然会报错 system("pause");
return ;
}
 
 
 
 

C语言复习---获取最大公约数(辗转相除法和更相减损法)的更多相关文章

  1. C语言,最大公约数---更相减损术

    // 最大公约数 更相减损法 int commonDivisor() { int i,k,n=0; printf("请输入两个不同的正整数,用,隔开\n"); scanf(&quo ...

  2. 求最大公因数(辗转相除法&更相减损术)

    求最大公因数(辗转相除法&更相减损术) 辗转相除法 又名欧几里得算法 ,其原理其实是基于这个定理:\(gcd(a,b)=gcd(b,a\%b)\),详细证明,而任何数与0的最大公约数是它本身 ...

  3. C语言复习---获取最小公倍数(公式法:两个数相乘等于最小公倍数乘以最大公约数)

    公式法:两个数相乘等于最小公倍数乘以最大公约数 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib ...

  4. C语言复习---获取矩阵的对角和

    #include <stdio.h> #include <stdlib.h> #include <math.h> #define MAX 5 int main() ...

  5. 【C语言】两个指针(地址)相减

    两个指针相减,为两个指针之间间隔这两个指针类型的数目. 如:int *p,*q; p-q=(p地址-q地址)/sizeof(int) #include <stdio.h> int main ...

  6. C语言复习---零散补充

    一:double和float使用scanf获取数据 printf输出float和double都可以用%f,double还可以用%lf. 2 scanf输入float用%f,double输入用%lf,不 ...

  7. Swift3.0语言教程获取字符串编码与哈希地址

    Swift3.0语言教程获取字符串编码与哈希地址 Swift3.0语言教程获取字符串编码与哈希地址,以下将讲解字符串中其它内容的获取方法. 1.获取字符串编码 在NSString中可以使用2个属性获取 ...

  8. Swift3.0语言教程获取C字符串

    Swift3.0语言教程获取C字符串 Swift3.0语言教程获取C字符串,为了让Swift和C语言可以实现很好的交互,开发者可以使用NSString的cString(using:)方法在指定编码格式 ...

  9. Swift3.0语言教程获取字符

    Swift3.0语言教程获取字符 Swift3.0语言教程获取字符,在字符串中获取某一下标位置(下标索引)处的字符是很常见的功能,在NSString中使用character(at:)方法实现,其语法形 ...

随机推荐

  1. 利用JS实现一个简单的二级联动菜单

    前几天在看js的相关内容,所以就简单写了一个二级联动菜单.分享一下. <!DOCTYPE html> <html lang="en"> <head&g ...

  2. SpringBoot日记——信息修改PUT篇

    我们常用的功能,除了post和get,还有put和delete,这篇文章就介绍一下这个put的基本用法. 页面跳转和回显 1. 首先,我们之前的页面已经将添加和修改的按钮都做好了,那么如何实现这些按钮 ...

  3. python 微信撤回消息

    import itchatfrom itchat.content import *import osimport reimport time# 文件临时存储页rec_tmp_dir = os.path ...

  4. Stm32l151+mpu6050+uart读取数据调试

    新近买了一个MPU6050模块,如上图,这个模块上的三块黑色分别是:稳压芯片662K,STM8s003f3p6,MPU6050. 根据此模块的说明书,可以使用USB转TTL将模块与上位机连接,通过卖家 ...

  5. python之GIL理解

    GIL(Global Interpreter Lock) 全局解释器锁 python3中是假的多线程,它不是真正的并行,是利用了cpu上下文的切换而已.同一时间只能有一个线程使用共享数据,其它线程处于 ...

  6. 实战重现隐藏在A标签_blank下的危险漏洞,简略说明noopener的作用

    前几日,在看阮一峰老师的博客文章中,发现了这么一篇 .标题为 <target = "_blank" 的危险性(英文)>.这篇文章同事看过之后因为不理解其中的危险之处,念 ...

  7. Scrum立会报告+燃尽图(十二月十一日总第四十二次):贡献分配和收集用户报告

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2484 项目地址:https://git.coding.net/zhang ...

  8. BugPhobia开发篇章:Beta阶段第V次Scrum Meeting

    0x01 :Scrum Meeting基本摘要 Beta阶段第五次Scrum Meeting 敏捷开发起始时间 2015/12/17 00:00 A.M. 敏捷开发终止时间 2015/12/17 23 ...

  9. 【读书笔记】Linux内核设计与实现(第五章)

    5.1 内核通信 系统调用在用户空间和硬件设备之间添加了一个中间层. 该层主要作用: 1.为用户空间提供了一种硬件的抽象接口. 2.保证了系统的稳定和安全. 3.每个进程都运行在虚拟系统中. 在Lin ...

  10. VS2013快速安装教程

    1.下载vs2013安装镜像.VS2013_RTM_ULT_CHS.iso链接: http://pan.baidu.com/s/1mguOdiK密码: rllz  建议使用百度网盘客户端下载,虽然被人 ...