今天我们来看看两个数的最大公约数怎么求,话不多说之间开干!
代码1(呆呆的暴力求解)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{int x, y;printf("请输入两个正整数:>");scanf("%d %d", &x, &y);int min = 0;if (x < y){for (min = x;min > 0;min--){if (x % max == 0 && y % max == 0){printf("两数最大公约数为:%d ", min);break;}}}if (y < x){for (min = y;min > 0;min--){if (x % min == 0 && y % min == 0){printf("两数最大公约数为:%d ", min);break;}}}return 0;
}
我们在分析数学模型的时候发现,我们如果想要使用计算机实现求两数的最大公约数的时候,我们需要先找两数中较小的那个,然后使用x和y去试除,直到出现一个数可以同时除x和y,那么这个数就是这两个数的最大公约数。我们这个代码从x>y和x<y两个方面进行分别运算,但是我们发现,这样的代码冗余的地方很多,我们会想,如果我们可以不用判断两次x大于y和x小于y就好了,我们对代码进行优化。
代码2(使用三目运算符解决冗余问题)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>//优化,三目运算符求解
//我们发现上面的步骤有些有点多余,比如我们将x与y的大小比较了两次而且每次都是使用暴力求解的方法进行解题。
int main()
{int x, y;//输入printf("请输入两个整数:>");scanf("%d %d", &x, &y);//得出x与y中小的那个int min = (x < y) ? x : y;int m = min;//从最大数开始式除,直到最大公约数while (1){if (x % m == 0 && y % m == 0){break;}m--;}printf("最大公约数为:>%d ", m);return 0;
}
这个代码我们使用三目运算符对代码进行优化,我们比较x和y的大小时将小的那个数放在min中,在三目运算符中,我们首先看看x是否小于y,如何是,我们将x给min,如果不是,我们将y给min。这样我们发现,步骤比之前要简化很多,但是这里我们其实还是在暴力求解的,我们还是从min开始一直试除直到我们可以将x和y都除尽的时候才输出,我们发现还可以优化。
代码3:使用欧几里得算法求解
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//欧几里得算法求解
int main()
{int x = 0, y = 0;int z;//输入printf("请输入两个整数:>");scanf("%d %d", &x, &y);while (z=x % y){x = y;y = z;}printf("最大公约数为:>%d\n ", y);return 0;
这里我们通过查找资料发现辗转相除是一个求解两数最大公约数的好方法,在计算过程中,我们用x模y,得到余数z,如果这里我们z为0,我们退出循环直接输出y,y为最小值,如果z不为0,我们将y给x,z给y,之后重复x模y,直到z=0,这个时候,y就是我们的最大公约数。
有些同学可能疑惑为什么这里最小值就是y了,如果我们输入12 24的话,这里y不就是24了嘛,为什么我们不输出24呢,这里我们就要注意,当我们x%y的时候,如果x比y小,我们是12%24,这里我们是商0余24,之后我们会进入while循环将x与y交换位置,之后会变为24 12,这个时候我们y中肯定就是最小值了,所以这里最后只需要输出y就好啦。
希望大家每天都可以学到新的知识呢,每天加油一点点,以后会看见不一样的自己呢!共勉!