洛谷 B4025:最大公约数 ← 辗转相除法+更相减损法
【题目来源】
https://www.luogu.com.cn/problem/B4025
【题目描述】
定义两个正整数的最大公约数 gcd(a,b) 为最大的正整数 d,使得 d 可以同时整除 a 和 b。
例如,gcd(9,12)=3,因为 9÷3 和 12÷3 的余数是 0,而无法找到一个比 3 更大的正整数满足要求。
现在给定两个正整数 a,b,要求出 gcd(a,b)。
【输入格式】
输入两个正整数 a,b。
【输出格式】
输出 gcd(a,b)。
【输入样例】
9 12
【输出样例】
3
【说明/提示】
对于 40% 的数据,1≤a,b≤1000。
对于所有的数据,1≤a,b≤10^9。
【算法分析】
● 辗转相除法
辗转相除法,又称欧几里德算法,是求两个正整数之最大公约数的算法。它是已知最古老的算法之一,可追溯至公元前 300 年,首次出现于欧几里德的《几何原本》中。该算法基于以下原理:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数,即 gcd(a,b) = gcd(b,a mod b),其中 gcd 表示最大公约数,mod 表示取余操作。
● 更相减损法
更相减损法是一种求两个正整数最大公约数的算法,它出自中国古代数学著作《九章算术》。更相减损法的基本原理是通过反复用较大的数减去较小的数,直到两数相等为止,此时的数即为两数的最大公约数。更相减损法原本是为约分而设计的,但它适用于任何需要求最大公约数的场合。
● 在 C++ 中,int 类型通常能表示的数值范围是从 -2,147,483,648 到 2,147,483,647,也即 -2^31 ~ 2^31-1,小于 2.15×10^9。若大于 2.15×10^9,需用 long long 型。
【算法代码一:辗转相除法】
#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b) {
if(b==0) return a;
else return gcd(b,a%b);
}
int main() {
int a,b;
cin>>a>>b;
cout<<gcd(a,b)<<endl;
return 0;
}
/*
in:
9 12
out:
3
*/
【算法代码二:更相减损法】
#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b) {
while(a!=b) {
if(a>b) a-=b;
else b-=a;
}
return a;
}
int main() {
int a,b;
cin>>a>>b;
cout<<gcd(a,b)<<endl;
return 0;
}
/*
in:
9 12
out:
3
*/
【算法代码:利用 algorithm 包中自带的函数 __gcd()】
#include <bits/stdc++.h>
using namespace std;
int main() {
int a,b;
cin>>a>>b;
cout<<__gcd(a,b)<<endl;
return 0;
}
/*
in:
9 12
out:
3
*/
【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/136272280