蓝桥杯- 算法训练 最大最小公倍数

问题描述

已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。

输入格式

输入一个正整数N。

输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入
9
样例输出
504
数据规模与约定

1 <= N <= 106

参考:

当n为奇数时,答案一定是n*(n-1)*(n-2)。 

 当n为偶数时,答案是n*a*b,其中a>=n-3,b>=n-3

思路:对于n为奇数时则直接得出答案n*(n-1)*(n-2)。

 当n为偶数时,则考虑4种情况

同时比较3个数的最小公倍数用递归

 long long int max ( long long int m, long long int n){
    if(m%n == 0){
        return n;
    }
    return  max(n,m%n);
}
 long long int max1( long long int m, long long int n, long long int k){
     long long int y = m*n*k;
     long long int a = max(m,n);
     long long int b = max(m*n/a,k);
    return y/b;
}

总代码为

#include <stdio.h>
#include <stdlib.h>
 long long int s[10];
 long long int max ( long long int m, long long int n){
    if(m%n == 0){
        return n;
    }
    return  max(n,m%n);
}
 long long int max1( long long int m, long long int n, long long int k){
     long long int y = m*n*k;
     long long int a = max(m,n);
     long long int b = max(m*n/a,k);
    return y/b;
}
int main()
{


    long long int n,p,i,q = 0,j,k;
    scanf("%I64d",&n);
    if(n%2 == 1){
        p = n*(n-1)*(n-2);
        printf("%I64d\n",p);
    }else{
        s[0] = max1(n-1,n-2,n-3);
        s[1] = max1(n,n-2,n-3);
        s[2] = max1(n,n-1,n-3);
        s[3] = max1(n,n-1,n-2);
        for(i = 0;i<4;i++){
               // printf("&&&%I64d\n",s[i]);
            if(s[i]>q){
                q = s[i];
            }
        }
        printf("%I64d\n",q);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_35654259/article/details/79114670