笨方法:
思路:从给出两个数的较小的那个数开始循环递减,当找到一个数能和所给两个数整除时,输出该数
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define max(x,y) (x<y?x:y)//宏定义
int main(void)
{
int a = 0, b = 0, c = 0,i=0;
//输入两个数
scanf("%d %d", &a, &b);
c = max(a, b);//求出最小的数
for (i = c; i > 1; i--)
if (a % i == 0 && b % i == 0)//当找到一个数能整除两数时跳出循环
break;
printf("%d", i);
return 0;
}
很容易发现,这个算法相当粗暴,这时若是使用辗转相除法则会很方便
辗转相除法
原理:
辗转相除法之所以有效是因为其基于一个核心原理,即:
两个数的最大公约数等于其中较小的数字和二者之间余数的最大公约数
为了更容易理解,可以对这句话进行简单的分析
首先根据此描述,可以先确定这是一个等式,即()= () ,然后再将相应的值填入括号中,就可以直接列出如下等式:GCD(较大数,较小数)= GCD(较小数,二者余数);紧接着可以对其进行进一步的改写,将其改写为GCD(被除数,除数) = GCD(除数,余数)(这里的GCD就是辗转相除算法),这样理解起来会更加容易。
也是利用这个方法,我们就能更有效率的求出最大公约数
进阶版代码如下:
#include<stdio.h>
int main()
{
int a=0,b=0,t=0;
scanf("%d %d",&a,&b);//输入两数
t=a%b;
while(t!=0)//如果两数取余不为0
{
b=a;//除数变为被除数
b=t;//被除数变为余数
t=a%b;
}
printf("%d",b);//当余数变为0时,除数即为最大公约数
return 0;
}