题目概述
题目内容:
给定两个数,求这两个数的最大公约数
例如:
输入: 20 40
输出:20
输入:5 7
输出:1
一、题目分析
由题目可得输入两个数,求最大公约数
1、最大公约数什么:两个整数共有约数最大的一个称为最大公约数。
2、如何求最大公约数:
假设两个数A和B,最大的公约数可能为两个数中较小值(从较小值入手,从较小值找到的可以整除A,B的整数一定为最大公约数)。
思路一
例如:
整除类型:从(15 5,18 6)中找较小值,5,6分别为它们的最大公约数。
非整除类型:从(18 20)找较小值18,就需要判断能否整除,不能整除最小值就-1(得到值17 16 15 …3 2),再重复上述判断,最终找到最大公约数2.
思路二
利用数学中的辗转相除法
二、思路转换为代码
方法1.
利用三目操作符将输入的a,b中较小的值存在t中
判断最大公约数的条件 -> a % b ==0&&b % t ==0
一次判断不能确定正好是最大公约数,需用的循环while(),每判断一次t-1,最后找到整除的最大公约数返回.
int GCD(int a, int b)
{
int t = a < b ? a : b;
//求最大公约数
while (1)
{
if (a % t == 0 && b % t == 0)
{
return t;
}
t--;
}
}
方法2.
辗转相除法:假设输入值 a,b,公式a % b = t ; a = b; b = t;
优点:效率高,不用求取a,b中的较小值
当a>b时
当a<b时
相当于多转换了一步其余步骤同上
代码如下(示例):
int GCD(int a, int b)
{
//求最大公约数
//a%b=t
int t = 1;
while (a % b)
{
t = a % b;
a = b;
b = t;
}
return b;
}
代码优化:
上述求余相对于求了两遍
int GCD(int a, int b)
{
//求最大公约数
//a%b=t
int t = 1;
while (t = a % b)
{
a = b;
b = t;
}
return b;
}
总代码
int GCD(int a, int b)
{
//求最大公约数
//a%b=t
int t = 1;
while (t = a % b)
{
a = b;
b = t;
}
return b;
}
int main()
{
int a, b;
scanf("%d %d", &a, &b);
int ret=GCD(a, b);
printf("最大公约数=%d\n", ret);
return 0;
}
总结
C语言的简单练习,学习辗转相除法的思想,把问题转换为代码以解决问题,小试牛刀,如有错误希望读友指正。