题目:

给定两个不同的正整数 a,b, 求一个正整数 k 使得 gcd(a+k,b+k) 尽可能 大, 其中 gcd(a,b) 表示 aa 和 bb 的最大公约数, 如果存在多个 k, 请输出所有满 足条件的 k 中最小的那个。

输入格式
输入一行包含两个正整数 a,b, 用一个空格分隔。

输出格式
输出一行包含一个正整数 k 。

样例输入
5 7

样例输出
1

评测用例规模与约定
对于 20% 的评测用例,a<b≤105;

对于 40% 的评测用例, a<b≤109;

对于所有评测用例, 1≤a<b≤1018 。

运行限制
最大运行时间:1s
最大运行内存: 512M

代码:

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
long a,b;
a=sc.nextLong();
b=sc.nextLong();
long c,k;
if (a>b){
c=a-b;
}
else {
c=b-a;
}
k=c-a%c;
System.out.println(k);
}
}

思路:

最大公约数因为a,b两数不相等,要加上一个相同的数k则可以求出的最大公约数必为a,b两数的差(代码也可以写成差的绝对值,我是进行比较了)。举个例子,5,7。

5和7加上同一个数因为他们的差值是2假设加上k后最大公约数可能为3,5+4=9,那么7就要加到12需要加5,就不满足条件了。

公约数我们求出来了就是差值,求最小k只需要用最大公约数减去a,b任意一个数除以最大公约数的余数即可。