Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C语言小游戏——3、寻找大公约和小公倍的多种求法

C语言小游戏——3、寻找大公约和小公倍的多种求法

作者头像
用户11015888
发布于 2024-03-11 11:53:31
发布于 2024-03-11 11:53:31
8400
代码可运行
举报
文章被收录于专栏:csdncsdn
运行总次数:0
代码可运行

一、最大公约数有四种求解:

什么是最大公约数呢?定义如下: 如果数 a 能被数 b 整除,a 就叫做 b 的倍数,b 就叫做 a 的约数。几个整数中公有的约数,叫做这几个数的公约数;其中最大的一个,叫做这几个数的最大公约数

例:12、18的公约数有1、2、3、6,其中最大的一个是6,则6是12与18的最大公约数。

法 一:暴力求解

从上面举的例子我们可以分析,最大公约数一定不会大于两个数之间的最小数,最大也就是两个数的最小值,如20、40的最大公约数是20。

思路:

所以我们可以令两个数的最小值为最大公约数,然后我们再用两个数分别除去这两个数的最小值,如果都能整除,则就是最大公约数,否则就自减 1 再去除,判断是否能整除,不能就再自减1,一直循环下去直到找到都能被整除的数。(最坏的情况就是找到1停止)

比如上面的12、18这俩个数,这两个数的最小值是12,则定义变量tmp=12,然后判断12、18是否都能整除变量tmp。 tmp=12,不能被整除,自减1 tmp=11,不能被整除,自减1 tmp=10,不能被整除,自减1 tmp=9,不能被整除,自减1 tmp=8,不能被整除,自减1 ········ tmp=6,都能被12、18整除 所以找到最大公约数了,12,18的最大公约数是6。

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
{
	int a = 0, b = 0;
	printf("请输入数字:");
	scanf("%d %d", &a, &b);
	int tmp = a < b ? a : b;//把两个数的最小值赋给tmp
	{
		while (1)
		{
			if (a % tmp == 0 && b % tmp == 0)
			{
				break;//找到最大公约数了,跳出循环
			}
			tmp--;//两个数都不能整除,自减1
		}
		printf("最大公约数为:%d", tmp);
	}
	return 0;
}

法 二:更相减损法

更相减损法:也叫更相减损术,是出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。

思路: 以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到它们两个数相等为止。则相等的两个数就是所求的最大公约数。

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
{
	int x = 0, y = 0;
	printf("请输入两个数字:");
	scanf("%d%d",&x,&y);
	while (x != y)  //两个数不相等就一直循环
	{
		if (x > y)
		{
			x = x - y;
		}
		else if (x < y)
		{
			y = y - x;
		}
	}
	//到这里则是两个数相等,取其任何一个就是最大公约数
	printf("最大公约数是:%d\n", x);
	return 0;
}

法 三:辗转相除法

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

代码实现:以三个数为例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
 {
    int x = 0, y = 0, z = 0;
    int tmp = 0;
    // 输入三个整数
    printf("请输入三个数字:");
    scanf("%d %d %d", &x, &y, &z);
    // 计算第一个数和第二个数的最大公约数
    while (y != 0) 
    {
        tmp = x % y;
        x = y;
        y = tmp;
    }
    // 计算得到的最大公约数与第三个数的最大公约数作比较
    while (z != 0) 
    {
        tmp = x % z;
        x = z;
        z = tmp;
    }
    // 输出结果
    printf("三个数的最大公约数是:%d\n", x);
    return 0;
}

二、最小公倍数有两种求解:

几个数共有的倍数叫做这几个数的公倍数,其中除0以外最小的一个公倍数,叫做这几个数的最小公倍数。

举几个例子:12、18的最小公倍数是36

法 一:暴力求解

通过上面举的例子我们可以发现 最小公倍数一定大于或等于两个数的最大值。

思路:所以我们可以先找出两个数的最大值,然后赋值给变量tmp,然后用变量tmp分别除去两个数,如果能整除,则就是最小公倍数,否则变量tmp自加1,再分别除去两个数,判断是否能整除,一直循环下去,直到变量tmp都能够整除两个数。

比如12、18这两个数,这两个数的最大值是18,则定义变量tmp=18,然后判断变量tmp是否都能整除12、18。 tmp=18,不能整除12、18,自加1 tmp=19,不能整除12、18,自加1 tmp=20,不能整除12、18,自加1 tmp=21,不能整除12、18,自加1 tmp=22,不能整除12、18,自加1 ········ tmp=36,都能整除12、18 所以找到最小公倍数了,12,18的最小公倍数是36。

代码实现:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int main()
{
	int a = 0, b = 0;
	printf("请输入两个数字:");
	scanf("%d %d", &a, &b);
	int tmp = a > b ? a : b;
	while (1)
	{
		if (tmp % a == 0 && tmp % b == 0)
		{
			break;
		}
		tmp++;
	}
	printf("最小公倍数:%d", tmp);
	return 0;
}

法 二:公式法

由于两个数的乘积等于这两个数的最大公约数与最小公倍数的积。 所以,求两个数的最小公倍数,就可以先求出它们的最大公约数,然后用两个数的积除去最大公约数得出它们的最小公倍数。 因此我们可以利用上面任何一种求最大公约数的方法来实现,先求最大公约数然后再求最小公倍数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int Fun(int x, int y)
{
	if (x > y)
	{
		return Fun(y, x - y);  //再开辟一个Fun函数
	}
	else if (x < y)
	{
		return Fun(x, y - x);   //再开辟一个Fun函数
	}
	else   //找到相减到相等
	{
		return x;
	}
}
int main()
{
	int x = 0, y = 0;
	printf("请输入两个数字:");
	scanf("%d%d", &x, &y);
	int ret = Fun(x, y);
	printf("最大公约数是:%d\n", ret);
	printf("最小公倍数是:%d\n", x * y / ret);  //利用公式法,直接求出
	return 0;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-03-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
详解最大公约数和最小公倍数
总体思路:假设要求a,b两个数的最大公约数,先求a,b两数的因子,因子会求吧(如果不会看这里,用for循环遍历从1到a的数,如果能被a整除,即取余为0,则这个数为a的因子。如果会请自动省略这里,蟹蟹٩('ω')و)然后同理求b的因子,找到相同的部分再从中找出最大值,不仅思路麻烦,时间复杂度还高,至于代码不贴了,诶,可不是因为我不会,是因为我懒啦。
一枕眠秋雨
2024/03/11
1030
11.09作业详解(弹球距离,素数,最大公约数最小公倍数,求整数位数及其各位数字之和,打印乘法表)
代码比较简洁但并不容易理解,首先函数递归要有一个限制条件,且想办法然函数中的某个形参无限逼近与该条件,由题目可知,这个限制条件是让h*p^n逼近与0.001即可,当h*p^n满足小于0.001时返回h*p^(n-1),然后再往前推直到求到第一个dist函数,需要注意的是每次x与h的关系,第一次x=h*p,第二次传递x=h1*p,这时的h1由于第一次赋值等于h*p...然后一直往后递推直到x<0.001后返回,假设h*p^3<0.001,这时返回h*p^2,由于h*p^2>0.001,返回h+h*p^2+h*p^2...直到返回到第一次调用的dist函数即可。
一枕眠秋雨
2024/03/11
1190
11.09作业详解(弹球距离,素数,最大公约数最小公倍数,求整数位数及其各位数字之和,打印乘法表)
用C语言解决最大公约数问题
首先我们要考虑,什么是最大公约数,在数学中的定义是:最小公倍数是指两个或多个整数共有倍数中最小的一个。为了求出两个数的最下公倍数,可以采用枚举试错法。
用户10922923
2024/01/23
2230
用C语言解决最大公约数问题
​最大公约数、同余原理详解
欧几里得算法,也被称为辗转相除法,用于计算两个整数的最大公约数,其核心公式为:gcd(a,b) = gcd(b,a mod b)。
用户1142828
2025/04/12
540
C语言编程笔试题(二)
  好的,我们可以根据上图的思考过程和百度百科的介绍了解,知道了求最大公约数的过程。
RAIN7
2021/08/11
7460
C++求最大公约数和最小公倍数
用 “较大数” 除以 “较小数”,再用 “较小数” 除以 “第一余数”,再用“第一余数”除以 “第二余数”,
全栈程序员站长
2022/08/27
9210
C++求最大公约数和最小公倍数
求最大公约数和最小公倍数的算法[通俗易懂]
辗转相除法又称为欧几里德算法。这个方法大家已经都已经在数学上学过了。具体的步骤就是:用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。最后的除数就是这两个数的最大公约数。举个例子就是:比如两个数字,x=453,y=36;
全栈程序员站长
2022/08/27
1.1K0
C语言题解——最小公倍数的三种求法(含最大公约数)
  最小公倍数是指能同时将两数整除的最小倍数,而最大公约数是则是能被两数同时整除的最小因数。最小公倍数有个特点,就是最小为两数中的较大值,最大为两数的乘积;最小公倍数则是最小为1,最大为两数中较小值(如果两数相同,那么最大公约数、最小公倍数是它们本身)🎉🎉🎉
北 海
2023/07/01
8670
C语言题解——最小公倍数的三种求法(含最大公约数)
萌新小白必做题(1):找两数间的最大公约数与最小公倍数
如果a>b,则a和b与a-b和b的最大公约数相同,即Gcd (a, b) = Gcd (a-b, b) 性质2 如果b>a,则a和b与a和b-a的最大公约数相同,即Gcd (a, b) = Gcd (a, b-a) 性质3 如果a=b,则a和b的最大公约数与a值和b值相同,即Gcd (a, b) = a = b
对编程一片赤诚的小吴
2024/01/23
1550
Python数学计算工具4、Python求最大公约数
我们这里只看最大公约数,很多家长在陪同孩子做作业的时候就会遇到这个问题,孩子问你,这两个数的最大公约数是什么,你就要拿起纸笔来计算了,简单的还好,能被2/3整除的这类可以利用成倍的数值测试,几秒也就算出来了,但是很多的时候甚至是比较大的质因数,就很难通过大脑直接运算了,不过我们很多时候还是身边有计算机的,那么使用这个工具跑起来就方便了。
红目香薰
2022/11/30
5960
Python数学计算工具4、Python求最大公约数
C语言:求两个数的最大公约数和最小公倍数
求两个数的最大公约数:“辗转相除法”: 设两数为a和b(a>b),用a除以b,得a÷b=商…余数,若余数为0 ,则最大公约数为b;若余数不为0 ,则再用b÷余数, 得b÷余数=商1…余数1,若余数1=0,则最大公约数为余数,若余数1不为0,继续让商÷余数n,一直到能够余数为零 这时的除数即最大公约数。 求两个数的最小公倍数: 最小公倍数=两数的乘积÷最大公约数
全栈程序员站长
2022/08/27
5940
C语言例题:输入两个正整数m和n,求其最大公约数和最小公倍数。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/145832.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/29
2.9K0
最大公约数
公约数,亦称“公因数”。 它是一个能同时整除几个整数的数 。 如果一个整数同时是几个整数的 约数 ,称这个整数为它们的“公约数”。
阿伟@t
2023/10/10
2480
最大公约数
C语言 | 最大公约数与最小公倍数
解题思路:最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个;最小公倍数是指两个或多个整数公有的倍数叫做它们的公倍数,其中除0以外最小的一个公倍数就叫做这几个整数的最小公倍数。最小公倍数=两整数的乘积÷最大公约数 , 所以怎么求最大公约数是关键。
小林C语言
2020/12/27
1.2K0
C语言 | 最大公约数与最小公倍数
C语言最大公约数和最小公倍数
首先我们应该知道最大公约数和最小公倍数的基本概念 最大公约数:指两个或多个整数共有约数中最大的一个 最小公倍数:俩数相乘除以最大公约数 一、最大公约数 方法一:穷举法 先令最大公约数max为1,当俩个数x、y都能被循环变量 i 整除时,把循环变量 i 赋值给最大公约数max,这样在循环结束后,就求得了最大公约数,但是这种做法过于复杂,耗时。
全栈程序员站长
2022/08/29
4550
C语言最大公约数和最小公倍数
最大公约数循环与递归版本
最大公约数介绍:最大公因数,也称最大公约数、最大公因子,指两个或多个整数共有约数中最大的一个。a,b的最大公约数记为(a,b),同样的,a,b,c的最大公约数记为(a,b,c),多个整数的最大公约数也有同样的记号。求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法。与最大公约数相对应的概念是最小公倍数,a,b的最小公倍数记为[a,b]。
GeekLiHua
2025/01/21
410
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
基本原理:for循环是一种常用的循环结构,它允许您指定一个初始化表达式、一个循环条件和一个更新表达式。语法格式为for(初始化表达式; 循环条件; 更新表达式)。初始化表达式在循环开始时执行一次,用于初始化循环变量。循环条件在每次循环迭代开始时进行检查,如果为真,则执行循环体中的代码。更新表达式在每次循环体执行完后执行,用于更新循环变量。
Rossy Yan
2025/01/13
1500
【C语言程序设计——函数】利用函数求解最大公约数和最小公倍数(头歌实践教学平台习题)【合集】
Python解决求最大公约数和最小公倍数问题
基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。
全栈程序员站长
2022/08/29
1.3K0
Python解决求最大公约数和最小公倍数问题
C语言求最小公倍数和最大公约数三种算法(经典)
最小公倍数:数论中的一种概念,两个整数公有的倍数成为他们的公倍数,其中一个最小的公倍数是他们的最小公倍数,同样地,若干个整数公有的倍数中最小的正整数称为它们的最小公倍数,维基百科:定义点击打开链接 求最小公倍数算法: 最小公倍数=两整数的乘积÷最大公约数 求最大公约数算法: (1)辗转相除法 有两整数a和b: ① a%b得余数c ② 若c=0,则b即为两数的最大公约数 ③ 若c≠0,则a=b,b=c,再回去执行① 例如求27和15的最大公约数过程为: 27÷15 余1215÷12余312÷3余0因此,3即为
Angel_Kitty
2018/04/08
4.6K0
多种方法求解“最大公约数”和“最小公倍数”
采用枚举法求解两个数的最大公约数是我们最常使用到的方法,两个整数的最大公约数为a,则a应该是大于等于1,小于等于这两个数的最小数的。因此我们可以在该范围内对可能的数进行枚举即可。
灰小猿
2022/05/05
7870
推荐阅读
相关推荐
详解最大公约数和最小公倍数
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验