2743: 【例35.3】 最大公约数

内存限制:64 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:48 解决:35

题目描述

求两个正整数$m$,$n$的最大公约数。

输入

输入$m$,$n$。

输出

$m$,$n$的最大公约数,对于全部数据:$m$,$n$<$1000000$。

样例输入 复制

100 18

样例输出 复制

2

提示

辗转相除法

给定两个数,求这两个数的最大公约数
欧几里得算法又称辗转相除法,是指用于计算两个非负整数a,b的最大公约数。
例如:假如需要求 100 和18 两个正整数的最大公约数,用欧几里得算法,是这样进行的:
100 / 18 = 5 (余10)
18 / 10= 1 (余8)
10 / 8 = 1 (余2)
8 / 2 = 4 (余0)
至此,最大公约数为2

以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数,所以就得出了 100 和 18 的最大公约数2。

假如求 18 和 100 两个数的最大公约数,即小的在前,大的在后:

18 / 100 = 0 (余18)

100 / 18 = 5 (余10)

......

结果与前面的一样。

#include<bits/stdc++.h>
using namespace std;
int m,n,r;
int main()
{
    cin>>m>>n;
    r=m%n;
    while(r!=0) {
    	m=n;
    	n=r;
    	r=m%n;
	}
	cout<<n<<endl;
	return 0;
}