C语言求最大公约数及最小公倍数
C语言求最大公约数及最小公倍数
1. 最大公约数
1.1 定义
最大公约数(Greatest Common Divisor,GCD),也称最大公因数、最大公因子,是一种数学概念,指两个或多个整数共有约数中最大的一个。
1.2 解法一:常规法(暴力法)
1.2.1 定义
由于最大公约数的本质是一个最大的能同时被两整数整除的自然数。所以我们先比较两数大小,从较大数开始向上递增,直到找到那个最小公倍数。
1.2.2 代码实现
int gcd4(int a, int b)
{//首先找到两个数中较大的数,用a存储较大数if (a < b){int temp = a;a = b;b = temp;}//从较大数开始寻找符合条件的最大公约数for (int i = a; i > 0; --i){if (a % i == 0 && b % i == 0){return i;}}
}
1.3 解法二:辗转相除法(欧几里德法)
1.3.1方法解释:
用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
1.3.2实例:
例如,求(319,377):
∵ 319÷377=0(余319)
∴(319,377)=(377,319);
∵ 377÷319=1(余58)
∴(377,319)=(319,58);
∵ 319÷58=5(余29)
∴ (319,58)=(58,29);
∵ 58÷29=2(余0)
∴ (58,29)= 29;
∴ (319,377)=29。
1.3.3 代码实现
/*** 递归版辗转相除法* @param a* @param b* @return*/
int gcd1(int a, int b)
{if (a % b == 0){return b;}else{return gcd1(b, a % b);}
}/*** 非递归辗转相除法求解最大公约数* @param a* @param b* @return*/
int gcd2(int a, int b)
{while (b != 0){int temp = a % b;a = b;b = temp;}return a;
}
1.4 解法二:更相减损法
1.4.1 方法解释:
(如果需要对分数进行约分,那么)可以折半的话,就折半(也就是用2来约分)。如果不可以折半的话,那么就比较分母和分子的大小,用大数减去小数,互相减来减去,一直到减数与差相等为止,用这个相等的数字来约分,这个数就是最大公约数;
1.4.2 步骤:
第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。
第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。
则第一步中约掉的若干个2的积与第二步中等数的乘积就是所求的最大公约数。
1.4.3 实例:
- 用更相减损术求98与63的最大公约数。
解:由于63不是偶数,把98和63以大数减小数,并辗转相减:
98-63=35
63-35=28
35-28=7
28-7=21
21-7=14
14-7=7
所以,98和63的最大公约数等于7。
- 用更相减损术求260和104的最大公约数。
解:由于260和104均为偶数,首先用2约简得到130和52,再用2约简得到65和26。
此时65是奇数而26不是奇数,故把65和26辗转相减:
65-26=39
39-26=13
26-13=13
所以,260与104的最大公约数等于13乘以第一步中约掉的两个2,即1322=52。
1.4.4 代码实现
//定义静态变量,保存约掉的若干个2次数
static int count = 0;int gcd3(int a, int b)
{int temp;//任意给定两个正整数;判断它们是否都是偶数。if (a % 2 == 0 && b % 2 == 0 && !count){//若是,则用2约简;若不是则执行第二步。a /= 2;b /= 2;//保存约掉的若干个2次数count += 2;}//以较大的数减较小的数,a中保存大数if (a < b){temp = a;a = b;b = temp;}//接着把所得的差与较小的数比较,并以大数减小数if (a - b != 0){//递归求解return gcd3(b, a - b);}else{//计算完毕完后count要置为0,防止第二次调用时出错;//所以需要提前定义常量保存输出结果:约掉的若干个2的积与第二步中等数的乘积就是所求的最大公约数。int result = count * b;//置0count = 0;return result;}
}
2. 最小公倍数
2.1 定义
最小公倍数(Least Common Multiple(LCM))是一种数学概念,几个数共有的倍数叫做这几个数的公倍数,其中除0以外最小的一个公倍数,叫做这几个数的最小公倍数。
2.2 解法一:常规法(暴力法)
2.2.1 方法解释
由于最小公倍数的本质是一个最小的能同时被两整数整除的自然数。所以我们先比较两数大小,从较大数开始向上递增,直到找到那个最小公倍数。
2.2.2 代码实现
/*** 常规法求最小公倍数(暴力法)* @param a* @param b* @return*/
int lcm1(int a, int b)
{//首先找到两个数中较大的数,用a存储较大数if (a < b){int temp = a;a = b;b = temp;}//从较大数开始寻找符合条件的最小公倍数for (int i = a;; ++i){if (i % a == 0 && i % b == 0){return i;}}
}
2.3 解法二:公式法
2.3.1 定义
由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。即(a,b)×[a,b]=a×b。所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用上述公式求出它们的最小公倍数。
2.3.2 实例
求[18,20],即得[18,20]=18×20÷(18,20)=18×20÷2=180。求几个自然数的最小公倍数,可以先求出其中两个数的最小公倍数,再求这个最小公倍数与第三个数的最小公倍数,依次求下去,直到最后一个为止。最后所得的那个最小公倍数,就是所求的几个数的最小公倍数。
2.3.3 代码实现
int lcm2(int a, int b)
{//lcd函数上面已经介绍return a*b/lcd(a,b);
}
约数,然后用上述公式求出它们的最小公倍数。
2.3.2 实例
求[18,20],即得[18,20]=18×20÷(18,20)=18×20÷2=180。求几个自然数的最小公倍数,可以先求出其中两个数的最小公倍数,再求这个最小公倍数与第三个数的最小公倍数,依次求下去,直到最后一个为止。最后所得的那个最小公倍数,就是所求的几个数的最小公倍数。
2.3.3 代码实现
int lcm2(int a, int b)
{//lcd函数上面已经介绍return a*b/lcd(a,b);
}
C语言求最大公约数及最小公倍数相关推荐
- c语言有参有类最小公倍数,C语言求最大公约数和最小公倍数算法
C 语言求最大公约数和最小公倍数算法 C 语言求最大公约数和最小公倍数可以说是C 语言编程学习中一个重点和难点,它常常作为计算机专业学生参加各种考试必须要把握的内容.其算法方面除常用的辗转相除法外.还 ...
- c语言l利用辗转相除法约分,如何用c语言求最大公约数和最小公倍数
如何用c语言求最大公约数和最小公倍数 输入两个正整数m和n, 求其最大公约数和最小公倍数. <1> 用辗转相除法求最大公约数 算法描述: m对n求余为a, 若a不等于0 则 m 否则 n ...
- C语言求最大公约数与最小公倍数
该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105022773 求 ...
- c语言求最大公约数(c语言求最大公约数和最小公倍数代码)
C语言中求两个数的最大公约数的公式是什么? int i,a=3,b=6; int max=b; //初始化b大,下面判断如果a>b就把a给max //判断a,b大小 if(a>b) max ...
- C语言求最大公约数和最小公倍数
//本程序要求的是最大公约数和最小公倍数 //最大公约数的求法是:先求出最小的数,然后大数开始除以较小的数,然后减一,一直到2 //如果除的时候出现最大的数字除以某个数字是等于0,或者是除到2依然没有 ...
- C语言求最大公约数和最小公倍数(思路清晰+拓展)
最大公约数的求法 首先了解它的一般求法(欧几里得算法):假设存在两个数A和B,假如A%B的结果不为0,那么A和B的最大公约数是B与A%B的最大公约数,一直往下计算,直到后者为0,此时的最大公约数为A' ...
- C语言求最大公约数和最小公倍数的几种算法
求最小公倍数算法: 最小公倍数=两整数的乘积÷最大公约数 求最大公约数算法: (1)辗转相除法 有两整数a和b: ① a%b得余数c ② 若c=0,则b即为两数的最大公约数 ③ 若c≠0,则a=b,b ...
- 用c语言求最大公约数的流程图,如何用c语言求最大公约数和最小公倍数
a=g_cd(m,n); if (m>n) //最小公倍数=较大的数*(较小的数/最大公约数) { b=n; b/=a; return m*b; } else { b=m; b/=a; retu ...
- C语言|求最大公约数和最小公倍数多种方法
在开始之前我们先了解下什么是最大公约数和最小公倍数: 例如有两个数:a 和b 最大公约数用gcd表示,最小公倍数用lcm表示. 1.最大公约数就意味着能同时被a和b整除,即a%gcd==0 & ...
最新文章
- Hadoop: MapReduce2多个job串行处理
- 内存对齐的规则以及作用
- 独立软件开发商进军SaaS注意八个问题,互联网营销
- nagios出现乱码
- SAP UI5 应用开发教程之六十四 - 基于 OData V4 的 SAP UI5 表格控件如何实现 filter(过滤) 和 sort(排序)功能试读版
- 作家百态之一:作家、批评家与酒
- 五款帮助创业者迅速熟悉互联网创业的在线学习工具
- 数据科学生命周期_数据科学项目生命周期第1部分
- Qt笔记-AES加密
- IntelliJ IDEA 14 创建maven项目二
- java createcell_CreateCell
- Smith Builder ERP代码生成器(开源,提供源码下载)
- 推荐两个适合代码的字体
- STM32接收红外遥控数据
- 调查问卷题目设计注意事项
- java游戏貂蝉_血战三国之吕布貂蝉
- ImageJ 用户手册——第四部分(ImageJ用户界面)
- Flutter版本 网易云音乐
- 14个程序员常去的外国网站
- 阿里大文娱——优酷场景化营销