源自:百度百科

辗转相除法

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

例如,求(,):
∵ ÷=(余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. REST-framework快速构建API--初体验

    一.快速上手 1.环境准备 安装restframework,注册app pip install djangorestframework INSTALLED_APPS = [ 'django.contr ...

  2. Markdown之语法入门篇

    Markdown语法入门 一.什么是Markdown语言 我相信有很多小伙伴没有听说过Markdown语言.的确,对于一般人来说,有word足够了.但是有这么一群人,受够了word那糟糕的排版方式,需 ...

  3. cocos2d-x学习之路(二)——分析AppDelegate和HelloWorldScene文件

    这里我们来看一下cocos自动给我们生成的工程里有些什么东西,并且分析一下这些代码的用途,来为我们以后编写cocos程序铺下基础. 这里我建议看我这份随笔的看官先看看cocos官网的快速入门手册,不然 ...

  4. 如何基于 K8S 多租能力构建 Serverless Container

    当前 Kubernetes 已经成为名副其实的企业级容器编排规范,很多云平台都开始提供兼容 Kubernetes 接口的容器服务.而在多用户支持方面,多数平台选择直接提供专属虚机集群,用户需要花费大量 ...

  5. 1082. Read Number in Chinese (25)-字符串处理

    题意就是给出9位以内的数字,按照汉子的读法读出来. 读法请看下方的几个例子: 5 0505 0505 伍亿零伍佰零伍万零伍佰零伍 5 5050 5050 伍亿伍仟零伍拾万伍仟零伍拾  (原本我以为这个 ...

  6. 20135220谈愈敏Blog1_计算机是如何工作的

    计算机是如何工作的 存储程序计算机工作模型 冯诺依曼体系结构 从硬件角度来看:CPU和内存,由总线连接,CPU中有一个名为IP的寄存器,总是指向内存的某一块:CS,代码段,执行命令时就取IP指向的一条 ...

  7. 第二个Sprint ------第七天、第八天、第九天、第十天,第十一天

    这几天我们主要讨论界面的设计,也终于有了个初步的界面: 主界面截图

  8. (第三周)wc.exe—命令行实现对指定目录下文件的操作

    一.用户需求 程序处理用户需求的模式为: wc.exe [parameter][filename] 在[parameter]中,用户通过输入参数与程序交互,需实现的功能如下: 1.基本功能 支持 -c ...

  9. PHP filemtime() 函数

    定义和用法 filemtime() 函数返回文件内容上次的修改时间. 若成功,则时间以 Unix 时间戳的方式返回.若失败,则返回 false. 语法 filemtime(filename) 参数 描 ...

  10. java之常量折叠

    为什么会写着篇博客,因为昨天看了关于final关键字的解析.但是有个问题始终没有得到解决,于是请教了我qq上之前添加的知乎大神.他给我回复的第一条消息:常量折叠.身为渣渣猿的我立马查询了这个概念.这是 ...