1207:求最大公约数问题
时间限制: 1000 ms 内存限制: 65536 KB
提交数:40112 通过数: 24229
【题目描述】
给定两个正整数,求它们的最大公约数。
【输入】
输入一行,包含两个正整数(<1,000,000,000)。
【输出】
输出一个正整数,即这两个正整数的最大公约数。
【输入样例】
6 9
【输出样例】
3
【原题链接】信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)https://ybt.ssoier.cn/problem_show.php?pid=1207分析:
举个简单的例子:求18和24的最大公约数
第一次:a = 18 b = 24 c = a%b = 18%24 = 18
循环中:a = 24 b=18
第二次:a = 24 b = 18 c = a%b = 24%18 = 6
循环中:a = 18 b = 6
第三次:a = 18 b = 6 c=a%b = 18%6 = 0
循环结束
此时的b就是两个数中的最大公约数
本题用了辗转相除法。
辗转相除法是一种递归的思想,反复将较大的数除以较小的数,直到两个数相等为止。这个方法的基本思路是,先将两个数中的较大数除以较小数,得到余数,再将较小数和余数作为新的被除数和除数,继续进行计算,直到余数为零为止。此时,最后一次除法中的除数即为最大公约数。
#include <stdio.h>
int gcd(int a, int b)
{
if (b == 0)
return a;
else
return gcd(b, a % b);
}
int main()
{
int m = 0;
int n = 0;
scanf("%d %d", &m, &n);
printf("%d\n", gcd(m, n));
return 0;
}