求最大公约数

作者 : XiaXinyu
日期 :2021-09-20

题目: 给定 n 对正整数 ai,bi,请你求出每对数的最大公约数。

输入格式
第一行包含整数 n。

接下来 n 行,每行包含一个整数对 ai,bi。

输出格式
输出共 n 行,每行输出一个整数对的最大公约数。

数据范围
1≤n≤105,
1≤ai,bi≤2×109
输入样例:

2
3 6
4 6

输出样例:

3
2

思路:使用欧几里得算法(辗转相除法)公式:gcd(a,b) = gcd(b,a % b) 注: ①若 a | b 且 a | c 则 a | (b + c)

证明:设a 和 b 的最大公约数为d

注:x | y 代表 x 能整除 y

1.正推

已知d | a 且 d |b,只需推导出d | (a % b),因为a % b = a - [a / b] * b,令[a / b] = c,所有由 ①可知,d | (a % b)成立

2.反推

已知d | (a % b) 且 d | b,只需推导出d | a,因为a % b = a - [a / b] * b,所以d | (a - c * b),可知d |(a - c * b + c * b),所以d | a成立

证毕

代码(一行代码模版):

import java.util.*;
public class Main{
    public static int gcd(int a,int b){
        return (b != 0)? gcd(b,a % b) : a;
    }
    
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        int T = in.nextInt();
        while(T -- != 0){
            
            int a = in.nextInt();
            int b = in.nextInt();
            System.out.println(gcd(a,b));
        }    
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XiaXinyuuu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值