2016.10.14
【题目描述】
1030.求最大公约数
时限:1000ms 内存限制:10000K 总时限:3000ms
描述
给你两个正整数a、b,请你编写程序求出它们最大公约数,并输出这个数
输入
两个正整数a、b
输出
输出最大公约数(以回车结束)
输入样例
24 36
输出样例
12
【解题思路】
欧几里得算法求gcd(greatest common divisor)基于这个定理:
两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。
证明:
a = kb + r
r = a mod b
若d为a和b的公因数,则d|a,d|b
而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,因此d|r
因此d也是(b,a mod b)的公约数
因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也 是一样的。
【代码实现】
# include <stdio.h>
int gcd(int a,int b)
{
return b ? gcd(b, a%b) : a;
}
int main(void)
{
int a,b;
scanf("%d%d", &a, &b);
printf("%d\n", gcd(a,b));
return 0;
}
【心得体会】