1260最大公约数
(gcd算法) 咖老师的第一课,也是认真听的唯一一课
先给出模板(递归写法):
//a>b,要保证数据处理好再传入函数
int gcd (int a,int b){
if(b==0)return a;
return gcd(b,a%b);
}
这里给出我手推的过程:
设最大公约数为r,
b=xr,则a=(x+n)r,a%b=nr,此时(a%b)作为新的b,原来的b作为新的a,n和x就会越来越小——直到到达递归的出口:n=1,x=0。此时a=r,返回a就可以了。
当然也可以用while写:
int a,b,r;
while(b!=0){
r=a;//考虑r最后实际就是a的值,更新a,b变量的时候就可以少一个中间变量,但可读性较差
a=b;
b=r%b;
}
回到题目:
题目描述
给定两个正整数A,B,求它们的最大公约数
输入描述
第1行为一个整数T,表示测试数据数量接下来的T行每行包含两个正整数A,B。1<=T < 10^5,1< A,B < 10^9
输出描述
输出共行T,每行包含一个整数,表示答案。
给出蒟蒻AC代码:
#include <iostream>
using namespace std;
int gcd(int a,int b){
if(b==0) return a;
return gcd(b,a%b);
}
int main()
{
int t,a,b,re;
cin>>t;
while(t--){
cin>>a>>b;
if(b>a){//保证a>=b
re=b;
b=a;
a=re;
}
cout<<gcd(a,b)<<'\n';
}
return 0;
}
总结:gcd是算法中较为基础的一步,应该是大部分选手第一次接触递归的算法,算法简洁优雅非常经典。