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

文章目录

  • 题目思想
  • 示例代码

题目思想

这是一个求最小公倍数的题目
看到网上的题解说有一个数学常识:三个正整数的最小公倍数不会大于这三个数的乘积(PS:啥常识呀,我咋不知道啊)
当然,这是有一个前提的,当三个数两两互质时才可以使三个数相乘为这三个数的是最小公倍数。
而题中范围为1-N,所以我们需要选出两两互质的最大三个数。因此有以下三个情况:

  1. N为奇数时
    因为相邻的两个正整数是互质的,以及相邻的两个奇数也是互质的,所以直接输出 n ∗ ( n − 1 ) ∗ ( n − 2 ) n*(n-1)*(n-2) n(n1)(n2)
  2. N为偶数时
    N为偶数时,N如果不能被三整除时,N和N-3互质,但是由于是偶数,所以N和N-2必定不是互质的,因此需要返回 n ∗ ( n − 1 ) ∗ ( n − 3 ) n*(n-1)*(n-3) n(n1)(n3)
    N为偶数时,N如果能被三整除时N和N-3可能不是互质的情况,因此我们需要返回的是 n ∗ ( n − 1 ) ∗ ( n − 5 ) n*(n-1)*(n-5) n(n1)(n5),但是这时就有一个问题,我们明显可证出 ( n − 1 ) ∗ ( n − 2 ) ∗ ( n − 3 ) > n ∗ ( n − 1 ) ∗ ( n − 5 ) (n-1)*(n-2)*(n-3) > n*(n-1)*(n-5) (n1)(n2)(n3)>n(n1)(n5),因此我们应该返回 ( n − 1 ) ∗ ( n − 2 ) ∗ ( n − 3 ) (n-1)*(n-2)*(n-3) (n1)(n2)(n3)

示例代码

#include
using namespace std;
int main(){
	long long n,res;
	cin >> n;
	if(n%2!=0){
		res=n*(n-1)*(n-2);
	}
	else if(n%2==0){
		if(n%3!=0){
			res=n*(n-1)*(n-3);
		}
		else{
			res=(n-1)*(n-2)*(n-3);
		}
	}
	cout << res << endl;
	return 0;
}

你可能感兴趣的:(算法)