问题描述
已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。
输入格式
输入一个正整数N。
输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定
1 <= N <= 106。
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static int num;
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int arr[]=new int [n*(n-1)/2];
int arr1[]=new int [n];
int f;
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
gcd(i, j);
arr[j]=i*j/num;
}
}
Arrays.sort(arr);
f=arr[n*(n-1)/2-1];
for(int i=1;i<=n;i++){
gcd(f, i);
arr1[i-1]=i*f/num;
}
Arrays.sort(arr1);
System.out.println(arr1[n-1]);
}
}
public static void gcd(int a,int b){
if(a<b){
int temp=a;
a=b;
b=temp;
}
if(b==0){
num=a;
}
else{
gcd(b, a%b);
}
}
}
在蓝桥杯的oj 上过不去,Java数组装不下整体思路是对的。用了辗转相除算法,以及两数最大公约数与最小公倍数之积为两数成绩。
后来去网上参考的c++代码。
c++ AC 如下
#include<iostream>
using namespace std;
int main() {
long long n, ans;
while(cin >> n) {
if(n <= 2) {
ans = n;
}
else if(n % 2) {
ans = n * (n - 1) * (n - 2);
}
else {
if(n%3) ans = n * (n-1) * (n-3);
else ans=(n-1) * (n-2) * (n-3);
}
cout << ans << endl;
}
return 0;
}