蓝桥杯试题 算法训练 最大最小公倍数(C++版)

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

输入格式
输入一个正整数N。

输出格式
输出一个整数,表示你找到的最小公倍数。
样例输入

9

样例输出

504

数据规模与约定
1 <= N <= 106

推荐一篇很好的题解:点击这里

一开始想到的 代码1(暴力法,不过暴力的超时了。。。AQA)

#include <iostream>
using namespace std;
int gcd(int x, int y)//目的求出这两个数的最大公约数 (转辗相除法)
{
	int r;
	while (y != 0)
	{
		r = x % y;
		x = y;
		y = r;
	}
	return x;
}
int   LeastCommonMultiple(int a, int b, int c)//目的求出三个数的最小公倍数
{
	int two = a * b / gcd(a, b);
	int three = two * c /gcd(two, c);
	return three;
}
int main() {
	int N;
	cin >> N;
	int max = 0;
	for (int i = 1; i <= N; i++)
	{
		for (int j = 2; j <= N; j++)
		{
			for (int k = 3; k <= N; k++)
			{
				if (i != j && j != k && k != i)
				{
					if (max < LeastCommonMultiple(i, j, k))
					{
						max = LeastCommonMultiple(i, j, k);
					}
				}
			}
		}
	}
	cout << max;
	return 0;
}

代码2:(运用了数论的知识)

当然,需要明白他们的最小公倍数的最大必然是在N附近的。至此,才有了下面的呈现。

#include <iostream>
using namespace std;
int main() {
	long long int  N, ans;//这里为long long(或long long  int),不能是long或int
	cin >> N;
	if (N % 2 == 1)//当n是奇数时
	{
		ans = N * (N - 1) * (N - 2);
	}
	else
	{
		if (N % 3)//当n为偶数并且n不能整除3时
		//不能写成N % 3==1,因为还有N % 3==2的时候
		{
			ans = N * (N - 1) * (N - 3);
		}
		else {//当n为偶数并且n能整除3时
			ans = (N - 3) * (N - 1) * (N - 2);
		}
	}
	cout << ans;
	return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值