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

算法训练 最大最小公倍数  
时间限制:1.0s   内存限制:256.0MB
   
问题描述

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

输入格式

输入一个正整数N。

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

1 <= N <= 106


首先,大于1的两个相邻的自然数必定互质。

n是奇数时,n、n-1、n-2必定两两互质,最大公倍数为 n*(n-1)*(n-2)。 证明:n是奇数,那么n,n-1,n-2一定是两奇加一偶的情况。则一定不存在公因子2,因为只有一个偶数。假设剩下的n,n-2中有一个数能被3整除,那么另一个数一定不能被3整除。为此,n,n-1,n-2的乘积不仅是最大的公倍数,而且一定两两互质。


n是偶数且不能被3整除时,n和n-2必定有公因子2,那么最大公约数就可以换成 n*(n-1)*(n-3) 。

但是若n是偶数且能被3整除,那么n和n-3就有公因子3,最大公约数换成(n-1)*(n-2)*(n-3),两奇夹一偶的情况。


还要注意应该用long long存数据。

此外,本题在蓝桥OJ上的数据有误,只能得60分。。

参考博客:http://www.cnblogs.com/PJQOOO/p/4394313.html


代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int main(){
	//freopen("input.txt","r", stdin);
	//freopen("output.txt", "w", stdout);
	long long n;
	while(~scanf("%lld", &n) ) {
		if(n < 3) {
			printf("%lld\n", n);
		}
		else if(n % 2 != 0) {
			printf("%lld\n", (n - 2) * (n - 1) * n);
		}
		else {
			if(n % 3 != 0) {
				printf("%lld\n", (n - 3) * (n - 1) * n);
			}
			else {
				printf("%lld\n", (n - 3) * (n - 2) * (n - 1));
			}
		}
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值