算法训练 最大最小公倍数

时间限制:1.0s   内存限制:256.0MB

问题描述

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

输入格式

输入一个正整数N。

输出格式

输出一个整数,表示你找到的最小公倍数。

样例输入

9

样例输出

504

数据规模与约定

1 <= N <= 106。

解题思路:其实看似挺简单的一道题,但是却需要分析一番。虽然知道是用贪心法,下面的代码能ac,但自己的贪心策略远远不够准确,不如最后面的方法简洁准确。自己的分析能力还是很烂。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#define for(i,x,n) for(int i=x;i<n;i++)
#define ll long long int

using namespace std;

ll gcd(ll a,ll b){
    ll t=a%b;
    while(b){
        a=b;
        b=t;
        if(b==0){
            return a;
        }
        t=a%b;
    }
    return a;
}

int main()
{
    ll n;
    ll maxx=0;
    scanf("%lld",&n);
    if(n%2==1){
        printf("%lld",n*(n-1)*(n-2));
        return 0;
    }else{
        ll t=n*(n-1)/gcd(n,n-1);
        for(i,n-40,n+1){
            ll lcm=t*i/gcd(t,i);
            if(lcm>maxx){
                maxx=lcm;
            }
        }
        t=(n-1)*(n-2)/gcd(n-1,n-2);
        t=t*(n-3)/gcd(t,n-3);
        if(t>maxx){
            maxx=t;
        }
        printf("%lld",maxx);
    }
    return 0;
}

下面是网上的代码,这是地址

首先确定是从大到小开始看,然后考虑到第一个数是奇数时,奇偶奇,其中两个奇数中间差2,但奇数没有因子2。

第一个数是偶数时,n,n-1,n-2是 偶奇偶,这时候两个偶数之间一定会有公共因子2,然后需要n-2再往后推一个取n-3,即n,n-1,n-3(偶奇奇),但这时候要注意,n,n-3之间可能会有公共因子3,

这时候就需要判断n能否被3整除,如果可以,n-3也会被3整除,这样就不能取这三个数了,就不能再取n了,整体往后推一个,取n-1,n-2,n-3.

#include<iostream>
using namespace std;
int main()
{
    long long n,ans;
    cin>>n;
    if(n<=2)
    ans=n;
    else if(n%2==1)
    ans=n*(n-1)*(n-2);
    else
    {
        if(n%3==0)
        ans=(n-1)*(n-2)*(n-3);
        else
        ans=n*(n-1)*(n-3);
    }
    cout<<ans<<endl;
    return 0;
}   
时间: 2024-12-20 20:01:09

算法训练 最大最小公倍数的相关文章

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

问题描述 已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少. 输入格式 输入一个正整数N. 输出格式 输出一个整数,表示你找到的最小公倍数. 样例输入 9 样例输出 504 数据规模与约定 1 <= N <= 106. 解题报告: 这个题的意思就是要我们在1~N的范围内找三个数,使他们的最小公倍数在这个范围内的组合是最大的.那么你的第一印象是什么的?我的第一印象是找三个两两互质的数,这样只需要相乘即可,就没有需要约分的地方. 接下来先说一个结论:大于1的两个相邻的自然

算法训练——最大最小公倍数

//最大最小公倍数 // #include<stdio.h> int main(){ int n; scanf("%d",&n); //连续3个数 奇偶奇 互质 if(n<=2) printf("2"); else if(n==3) printf("6"); else if(n%2==1) printf("%d",n*(n-1)*(n-2)); else printf("%d",(

算法训练 5-1最小公倍数

水题 #include <iostream> using namespace std; int fun(int x,int y) { int i; for(i=(x<y?x:y);!(x%i==0&&y%i==0);i--); return x/i*y; } int main() { int x,y; while(cin>>x>>y) { cout<<fun(x,y); } }

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

算法训练 最大最小公倍数 时间限制:1.0s   内存限制:256.0MB 问题描述 已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少. 输入格式 输入一个正整数N. 输出格式 输出一个整数,表示你找到的最小公倍数. 样例输入 9 样例输出 504 数据规模与约定 1 <= N <= 106. 注:贪心,从最大的三个数开始考虑,如果最大的数为奇数,那么相邻的三个数中有两个奇数,最大公约数为1,最小公倍数就为n(n-1)(n-2). 如果为偶数,那么往后移,考虑n(n-

28-算法训练 最大最小公倍数 -贪心

http://lx.lanqiao.cn/problem.page?gpid=T12 算法训练 最大最小公倍数 时间限制:1.0s   内存限制:256.0MB 问题描述 已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少. 输入格式 输入一个正整数N. 输出格式 输出一个整数,表示你找到的最小公倍数. 样例输入 9 样例输出 504 数据规模与约定 1 <= N <= 106. 注意: 1.数据大,int 会超过范围: 2.推导过程: n 为奇数时, 毫无疑问 n *

蓝桥杯——算法训练之乘积最大

问题描述 今年是国际数学联盟确定的"2000--世界数学年",又恰逢我国著名数学家华罗庚先生诞辰90周年.在华罗庚先生的家乡江苏金坛,组织了一场别开生面的数学智力竞赛的活动,你的一个好朋友XZ也有幸得以参加.活动中,主持人给所有参加活动的选手出了这样一道题目: 设有一个长度为N的数字串,要求选手使用K个乘号将它分成K+1个部分,找出一种分法,使得这K+1个部分的乘积能够为最大. 同时,为了帮助选手能够正确理解题意,主持人还举了如下的一个例子: 有一个数字串:312, 当N=3,K=1时

蓝桥杯 算法训练 ALGO-124 数字三角形

算法训练 数字三角形 时间限制:1.0s   内存限制:256.0MB 问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每一步可沿左斜线向下或右斜线向下走: ●1<三角形行数≤100: ●三角形中的数字为整数0,1,-99: . (图3.1-1) 输入格式 文件中首先读到的是三角形的行数. 接下来描述整个三角形 输出格式 最大总和(整数) 样例输入 573 88 1 02 7 4 44 5 2 6 5 样例输出 3

蓝桥杯 算法训练 ALGO-125 王、后传说

算法训练 王.后传说 时间限制:1.0s   内存限制:256.0MB 问题描述 地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横.坚.斜线位置. 看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地.各皇后都有自己的势力范围,但也总能找到相安无事的办法. 所有中国人都知道,皇权神圣,伴君如伴虎,触龙颜者死...... 现在有一个n*n的皇宫,国王占据他所在位置及周围的共9个格子,这些格子皇后不能使用(如果国王在王宫的边上,占用的格子可能不到9个).当然,皇后也不会攻击国王.

蓝桥杯 算法训练 ALGO-139 s01串

算法训练 s01串 时间限制:1.0s 内存限制:256.0MB 问题描述  s01串初始为"0"  按以下方式变换  0变1,1变01 输入格式  1个整数(0~19) 输出格式  n次变换后s01串 样例输入 3 样例输出 101 数据规模和约定  0~19 示例代码: 1 import java.util.Scanner; 2 3 public class Main { 4 static StringBuffer sb = new StringBuffer(); 5 public