基于蓝桥云课题库的刷题日记(仅包括算法模板题)#1——gcd 最大公约数

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是算法中较为基础的一步,应该是大部分选手第一次接触递归的算法,算法简洁优雅非常经典。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值