1062: 最大公约数
题目描述
输入两个不大于10的9次方的正整数,输出其最大公约数。
输入
输入两个正整数m和n,数据之间用空格隔开。
输出
输出一个整数,表示m和n的最大公约数。
样例输入
4 6
样例输出
2
提示
请查阅欧几里得定理及辗转相处法。
解题思路
辗转相除法
用较小数除较大数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。
举例:
求(319,377):
∵ 319÷377=0(余319)
∴(319,377)=(377,319);
∵ 377÷319=1(余58)
∴(377,319)=(319,58);
∵ 319÷58=5(余29)
∴ (319,58)=(58,29);
∵ 58÷29=2(余0)
由此可以推导出: (319,377)=29。
#include <stdio.h>
int main() {
int m, n, a; //m,n为输入的两个值,a为承接余数的变量
scanf("%d %d", &m, &n);
while (1) { //设置一个无限循环
a = n % m; //计算余数
if (a == 0) //如果余数等于0,说明找到最大公约数了,退出循环
break;
n = m; //替换
m = a; //替换
}
printf("%d", m); //跳出以后,倒数第二次运算出的余数便是最大公约数
return 0;
}