在做百度过往的笔试题,做到这道编程的时候在思考要去补下最小公倍数和最大公约数的知识了,看到一个解答很妙,在这记录下来,以后就这么用这个了,但是还是要了解最小公倍数和最大公约数的知识
一.题目
度度熊请你找出两个数a,b,满足1<=a,b<=n且lcm(a,b)-gcd(a,b)尽量大,输出最大的lcm(a,b)-gcd(a,b),其中lcm(a,b)表示a b 最小公倍数,gcd(a,b)表示最大公约数
输入: 一行一个数字n(2<=n<=10^9)
输出: 一个数表示最大值
输入描述: 一行一个数字
输出描述: 一行一个数字表示最大的。
示例1
输入例子:
5
输出例子:
19
答案:
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
long n=in.nextLong();
System.out.print((n-1)*n-1); // 这个地方很漂亮
}
}
解析:
这是一个数学题。为了理解这个问题,我们需要研究lcm(a,b)和gcd(a,b)之间的关系,并找出如何最大化他们之间的差异。首先,lcm(a,b)和gcd(a,b)之间的关系为:lcm(a,b) * gcd(a,b) = a * b给定这个关系,如果我们要最大化lcm(a,b) - gcd(a,b),我们需要尽量使lcm(a,b)尽量大,而gcd(a,b)尽量小。
对于给定的n,为了使得lcm(a,b)最大,b应该等于n,而a应该尽可能地靠近n。在这种情况下,最佳选择是a=n-1和b=n。 同时,为了使得gcd(a,b)尽量小,a和b不应该有任何共同的因子,除了1。选择a=n-1和b=n满足这一条件,因为连续的两个数是互质的,即他们的最大公约数是1。
综上,选择a=n-1和b=n可以达到lcm(a,b) - gcd(a,b)的最大值。 lcm(n-1, n) = n(n-1)因为n-1和n是互质的。gcd(n-1, n) = 1
所以,lcm(n-1,n) - gcd(n-1,n) = n(n-1) - 1 这就是为什么程序输出(n-1) * n - 1的原因。