一、题目
2021:【例4.6】最大公约数
时间限制: 1000 ms 内存限制: 65536 KB
【题目描述】
求两个正整数m,n的最大公约数。
【输入】
输入m,n。
【输出】
m,n的最大公约数。
【输入样例】
4 6
【输出样例】
2
【提示】
【数据范围】
对于全部数据:m,n<4000000。
二、思路
1.最好想的方法: for循环暴力穷举 m,n任选一个数 每次减一 知道能被两者整除 就为最大公约数。
2.欧几里得算法(辗转相除):稍微抽象一点 但是代码简单。用较大数除以较小数 得到余数 如果余数为0 :上一次除法中的除数就是最大公约数,余数不为0:用该余数替换上一次除法中的被除数 循环直到得到最大公约数。
3.更相减损法(辗转相减):第一步:任意给定两个正整数;判断它们是否都是偶数。若是,则用2约简;若不是则执行第二步。第二步:以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。用第一步中约掉的若干个2与第二步中等数的乘积就是所求的最大公约数。
三、代码
1.暴力穷举
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,m;
cin>>m>>n;
for(int i=m;i>=1;i--)
{
if((m%i==0)&&(n%i==0))
{
cout<<i;
break;
}
}
return 0;
}
2.辗转相除
#include<bits/stdc++.h>
using namespace std;
int main(){
int m, n, t, r;
cin>>m>>n;
while(m != 0)
{
if(m < n)
{
t = m;
m = n;
n = t;
}
m = m % n;
}
cout<<n;
return 0;
}