C语言复习---获取最大公约数(辗转相除法和更相减损法)
源自:百度百科
辗转相除法
辗转相除法:辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法。
例如,求(,):
∵ ÷=(余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**=。
这个过程可以简单地写为:
(,)(//) =>(,)=(,)=(,)=(,)=. (**) => []
比较:
代码实现
一:最简单方法
#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语言复习---获取最大公约数(辗转相除法和更相减损法)的更多相关文章
- C语言,最大公约数---更相减损术
// 最大公约数 更相减损法 int commonDivisor() { int i,k,n=0; printf("请输入两个不同的正整数,用,隔开\n"); scanf(&quo ...
- 求最大公因数(辗转相除法&更相减损术)
求最大公因数(辗转相除法&更相减损术) 辗转相除法 又名欧几里得算法 ,其原理其实是基于这个定理:\(gcd(a,b)=gcd(b,a\%b)\),详细证明,而任何数与0的最大公约数是它本身 ...
- C语言复习---获取最小公倍数(公式法:两个数相乘等于最小公倍数乘以最大公约数)
公式法:两个数相乘等于最小公倍数乘以最大公约数 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib ...
- C语言复习---获取矩阵的对角和
#include <stdio.h> #include <stdlib.h> #include <math.h> #define MAX 5 int main() ...
- 【C语言】两个指针(地址)相减
两个指针相减,为两个指针之间间隔这两个指针类型的数目. 如:int *p,*q; p-q=(p地址-q地址)/sizeof(int) #include <stdio.h> int main ...
- C语言复习---零散补充
一:double和float使用scanf获取数据 printf输出float和double都可以用%f,double还可以用%lf. 2 scanf输入float用%f,double输入用%lf,不 ...
- Swift3.0语言教程获取字符串编码与哈希地址
Swift3.0语言教程获取字符串编码与哈希地址 Swift3.0语言教程获取字符串编码与哈希地址,以下将讲解字符串中其它内容的获取方法. 1.获取字符串编码 在NSString中可以使用2个属性获取 ...
- Swift3.0语言教程获取C字符串
Swift3.0语言教程获取C字符串 Swift3.0语言教程获取C字符串,为了让Swift和C语言可以实现很好的交互,开发者可以使用NSString的cString(using:)方法在指定编码格式 ...
- Swift3.0语言教程获取字符
Swift3.0语言教程获取字符 Swift3.0语言教程获取字符,在字符串中获取某一下标位置(下标索引)处的字符是很常见的功能,在NSString中使用character(at:)方法实现,其语法形 ...
随机推荐
- 深入浅出OAuth2.0授权
一.前言 说到OAuth,先来一段百度到的比较官方的解释: OAUTH协议为用户资源的授权提供了一个安全的.开放而又简易的标准.与以往的授权方式不同之处是OAUTH的授权不会使第三方触及到用户的帐号信 ...
- stl源码剖析 详细学习笔记 算法总览
//****************************基本算法***************************** /* stl算法总览,不在stl标准规格的sgi专属算法,都以 *加以标 ...
- Docker-安装(CentOS7)
1.安装需要的软件包:yum-util提供yum-config-manager功能 yum install -y yum-utils device-mapper-persistent-data lvm ...
- mark一下岗位
一.中国移动杭州研发中心——测试开发工程师 https://campusresume.zhaopin.com/resume/14375/1 等内推信息 岗位描述:作为产品的质量守护者,在全面理解被 ...
- Nmap命令
命令行:(显示扫描过程 -v ) 扫描单个主机 #nmap www.hostName.com 扫描整个ip段(子网) #nmap 192.168.1.1/24 //表示当前ip下的24位掩码主机都要扫 ...
- symfon2 配置文件使用 + HttpRequest使用 + Global多语言解决方案
1. 在 app/conig中建立一个自命名的文件: abc.yml 2. 在 app/config/config.yml中导入abc.yml 文件头部: imports:- { resource: ...
- PHP Laravel Install and Quickstart
1.安装Laravel 一键安装包Laravel 要安装Laravel依赖的PHP7以上版本,以及php 扩展php-openssl php-pdo ... 以及Homestead github下载安 ...
- Unbuntu18.04通过apt源方式安装mysql5.7.22
Ubuntu18.04在今年4月底发布了,喜欢尝鲜的小伙伴肯定是第一时间就更新了系统版本,那么在Ubuntu18.04中怎么安装msyql5.7(mysql8.0因为新出,再观望一段时间)呢? * 带 ...
- JetBrains系列WebStorm等中文输入法无法跟随光标的问题的解决办法
参考:https://blog.csdn.net/wang414300980/article/details/79537875 电脑配置: 解决这个问题的思路就是修改启动软件的JDK,有以下几个方法: ...
- windows日志查看-非法关机判断方法
日志文件,它记录着Windows系统及其各种服务运行的每个细节,对增强Windows的稳定和安全性,起着非常重要的作用.但许多用户不注意对它保护,一些“不速之客”很轻易就将日志文件清空,给系统带来严重 ...