作者 : 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));
}
}
}