蓝桥杯 最大最小公倍数 C++算法练习 HERODING的蓝桥杯之路

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述

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

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

1 <= N <= 106。

解题思路:
为了寻找最大的最小公倍数,我们自然要把目光放到最大的几个数上面,通过分析有三种情况:
1.最大的数为奇数,那么其中任意两个数的公因子都是1,此时最大的三个数为(n, n - 1, n -2)奇偶奇,直接相乘即可。
2.最大的数为偶数且不能被3整除,此时n与n - 2有公因子2,所以为了避免损失,将n - 2移到n - 3。n, n - 1, n - 3相乘即可。
3.最大的数为偶数且能被3整除,此时n - 3也能被3整除,n - 1往后移动又和n有公因数2了,不如将n, n - 1都往后移动一个数,(n - 1) (n - 2) (n - 3), 奇偶奇,问题迎刃而解。
总的来说这道题的思路很重要,不然会走很多弯路,而且数学的基本功要扎实,不然意识不到最大的几个数的关系。

#include<bits/stdc++.h>  

using namespace std;  

int main()  
{  
    long long n,ans;  //防止ans值溢出 
    cin >> n;  
    if (n <= 2) // n小于等于2自然最大的最小公倍数为2 
	{
		ans = n;
	}  
    else if(n % 2 == 1) {	// n是奇数,一定没有公因数3,所以尽管乘在一起 
    	ans = n * (n-1) * (n-2);  
	}  
    else  
    {  
        if (n % 3 == 0)  //n是偶数且被3整除,整体往后推一个 
        ans = (n - 1) * (n - 2) * (n - 3);  
        else  //第三个往后推一个 
        ans = n * (n - 1) * (n - 3);  
    }  
    cout << ans << endl;  
    return 0;  
}

本篇的代码参考自这位老哥: https://blog.csdn.net/wr132/article/details/43538151

猜你喜欢

转载自blog.csdn.net/HERODING23/article/details/105761259