题目

代码
import java.util.Scanner;
public class lqb13_A组04GCD {
public static void main(String[] args) {
/**
* 希望gcd(a+k,b+k)尽可能的大,而k尽可能的小
* 根据 更相减损术 式子: gcd(a,b)=gcd(a,b-a)
* 可得: gcd(a+k,b+k)=gcd(a+k,b-a)
* 本题要希望gcd(a+k,b+k)尽可能的大, 所以gcd(a+k,b-a)也尽可能的大
* 公式: gcd(a+k,b−a) <= min(a+k,b−a)
* 取min(a+k,b-a)最小值,因为a+k是变量,b-a是常量,那么必定取b-a,使gcd最大化
* 得到 gcd(a+k,b-a)=b-a
* 由此也看出a+k必定要是b-a的倍数
* (a+k)%(b-a)==0
* 想要求出k:
* mod = a % (b - a)
* 1.判断 mod 是否等于0,如果正好等于0,那a正好是b-a的倍数,所以直接输出k=0
* 2.mod不等于0的情况,直接相减: k = (b - a) - mod
*
* 可AC
*/
Scanner scanner = new Scanner(System.in);
long a = scanner.nextLong();
long b = scanner.nextLong();
long y = b - a;
long mod = a % y, k = 0;
if (mod != 0) {
k = y - mod;
}
System.out.println(k);
}
}
该代码实现了一个Java程序,计算使得gcd(a+k,b+k)最大的最小整数k。利用更相减损术的性质,得出k应使(a+k)%(b-a)=0。程序首先读入两个长整数a和b,然后计算k,当a不是b-a的倍数时,k等于(b-a)减去a对(b-a)的余数。
7061

被折叠的 条评论
为什么被折叠?



