最大公约数与最小公倍数
求任意两个数的最大公约数
利用p和q之间求余,将q赋给p,再将余数 r 赋给q,如此循环下去,当q为0,最终的q即为最大公约数。
辗转相除法
public static int MaxCommonNum(int left , int right){
if(left<right){
int temp = left;
left = right;
right = temp;
}
if(left%right==0) return right;
else return MaxCommonNum(right,left%right);
}
求多个数的最大公约数
求多个数的最大公约数,那么可以传入一个数组int arr[]
- 取
arr[0]
赋给temp
(某个正整数的最大公约数是它本身),然后通过求两个数的最大公约数的方法先求出temp
与arr[1]
的最大公约数,将结果赋给temp
,则temp
表示arr[0]
与arr[1]
的最大公约数 - 然后再求
temp
与arr[2]
的最大公约数,将结果赋给temp
- 循环直到
temp
与剩余的每个数都求过最大公约数了,那么最后所求的那个就是这组数的最大公约数了
public static int MaxCommonNumFromMultiNumbers(int arr[]){
int temp = arr[0];
for(int i=1;i<arr.length;i++){
temp = MaxCommonNum(temp,arr[i]);
}
return temp;
}
求两个数的最小公倍数
两个数
a
,b
的最小公倍数=(a*b)/a
与b
的最大公约数
public static int MinCommonNum(int left,int right){
return left*right/MaxCommonNum(left,right);
}
求多个数的最小公倍数
public static int MinCommonNumFromNumbers(int arr[]){
int temp = arr[0];
for(int i=1;i<arr.length;i++){
temp = MinCommonNum(temp,arr[i]);
}
return temp;
}
应用
给一个数n(其中2<=n <= 10^9),请你找出两个数a, b, 满足1<= a, b <= n,使得他们的最小公倍数与最大公约数的差值最大,并输出这个差值。
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
if(n == 1){
System.out.println(0);
}
int res = Integer.MIN_VALUE;
for(int i = 1; i <= n; i++){
for(int j = i; j <= n; j++){
int lcm = MaxCommonNum(i, j);
int gcd = (i * j) / lcm;
res = Math.max(gcd - lcm, res);
}
}
System.out.println(res);
}
public static int MaxCommonNum(int left, int right){
if(left < right){
int temp = left;
left = right;
right = temp;
}
if(left % right == 0){
return right;
}else{
return MaxCommonNum(right, left % right);
}
}
今日推歌
----《去年夏天》
夏去了又回来
而人却已不在
它重复着我汹涌的忍耐
今年兰花又开
开了它也会败
我想要一个人活得精彩
有些人总会来
有些人在我心中在徘徊