首页 > 试题广场 >

最小众倍数

[编程题]最小众倍数
  • 热度指数:4168 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定5个正整数, 它们的最小的众倍数是指的能够被其中至少三个数整除的最小正整数。 给定5个不同的正整数, 请计算输出它们的最小众倍数。

输入描述:
输入包括一行,一行中有五个各不相同的正整数a, b, c, d, e(1 ≤ a, b, c, d, e ≤ 100), 以空格分割


输出描述:
输出一个整数,表示它们的最小众倍数
示例1

输入

1 2 3 4 5

输出

4

最简单易懂的python3程序,时间63ms
使用hash表,先遍历i,再遍历n,并将n*a[i]这一索引存入hash表格中,最后输出hash表中有等于3的索引

import sys
a=list(map(int,sys.stdin.readline().strip().split()))
buffer_dict={}
n=1
while n:
    for i in range(0,5):
        if not buffer_dict.get(n*a[i],0):
            buffer_dict[n*a[i]]=1
        else:
            buffer_dict[n*a[i]]+=1
        if buffer_dict[n*a[i]]>2:
            print(n*a[i])
            n=-1
            break
    n+=1
编辑于 2019-03-05 20:43:04 回复(3)
题中所给示例是5个数最小的情况,所以4应该就是最小的最小众倍数了。从4开始检验,上界为数组中最大的三个数相乘,每次自增1,看看当前的数满不满足最小众倍数的定义,如果满足就马上中断循环,打印出最小众倍数。
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Arrays;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] params = br.readLine().trim().split(" ");
        int[] arr = new int[5];
        for(int i = 0; i < 5; i++) arr[i] = Integer.parseInt(params[i]);
        Arrays.sort(arr);
        for(int num = 4; num <= arr[2]*arr[3]*arr[4]; num++){
            if(judge(arr, num)){
                System.out.println(num);
                break;
            }
        }
    }
    
    private static boolean judge(int[] arr, int num) {
        int count = 0;
        for(int i = 0; i < 5; i++){
            if(arr[i] > num) break;
            if(num % arr[i] == 0) count ++;
        }
        return count >= 3;
    }
}

发表于 2021-04-15 16:45:59 回复(0)
#include <bits/stdc++.h>
using namespace std;

int F(int x, int y, int z){
    int s;
    s = x*y/__gcd(x, y);
    s = s*z/__gcd(s, z);
    return s;
}

int main(){
    int a[5], Min=INT_MAX;
    for(int i=0;i<5;i++)
        scanf("%d", &a[i]);
    for(int i=0;i<5;i++)
        for(int j=i+1;j<5;j++)
            for(int k=j+1;k<5;k++)
                Min = min(Min, F(a[i], a[j], a[k]));
    printf("%d\n", Min);
    return 0;
}

发表于 2020-09-29 23:44:25 回复(0)
//dfs
import java.util.*;
public class Main{
    private static int mm=Integer.MAX_VALUE;
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        String[] s=sc.nextLine().split(" ");
        int[] ans=new int[5];
        for(int i=0;i<5;i++)
            ans[i]=Integer.parseInt(s[i]);
        //Arrays.sort(ans);
        for(int i=0;i<5;i++)
            dfs(ans,0,i,1);
        System.out.print(mm);
    }
    private static void dfs(int[] ans,int k,int index,int mic){
        if(k==2){
            return;
        }
        for(int i=index+1;i<5;i++){
            int mid=col(ans[i],ans[index]);
            mid=col(mic,mid);
            dfs(ans,k+1,i,mid);
            if(k==1)
                mm=Math.min(mm,mid);
        }
    }
    private static int col(int a,int b){
        int ma=a*b;
        if(a>b){
            while(b>0){
                int mi=a%b;
                a=b;
                b=mi;
            }
            return ma/a;
        }
        else{
            while(a>0){
                int mi=b%a;
                b=a;
                a=mi;
            }
            return ma/b;
        }
    }
}

发表于 2020-08-13 20:39:53 回复(0)
最小公倍数是两个数的乘积除以两者的最大公约数;
三个数的最小公倍数是前两个数的最小公倍数和第三个数的最小公倍数;
5个数取3个一共10种组合;
运用以上三点就可以解答该题了。
import java.util.Arrays;
import java.util.Scanner;
import java.util.Arrays;
import java.util.Scanner;

public class MinMultiple {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] str = sc.nextLine().split(" ");
        int[] num = new int[str.length];
        for (int i = 0; i < str.length; i++) {
            num[i] = Integer.parseInt(str[i]);
        }
        Arrays.sort(num);

        int mutiple = Integer.MAX_VALUE;
        for (int i = 0; i < 3; i++) {
            for (int j = i+1; j < 4; j++) {
                for (int k = j+1; k < 5; k++) {
                    int n2 = num[j] * num[i] / getMaxCommon(num[j], num[i]);
                    int n3 = n2 * num[k] / getMaxCommon(n2, num[k]);
                    mutiple = Math.min(n3, mutiple);
                }
            }
        }
        System.out.println(mutiple);
    }

    public static int getMaxCommon(int m, int n) {
        if (m % n == 0) {
            return n;
        } else {
            return getMaxCommon(n, m % n);
        }
    }

}


编辑于 2019-07-08 20:20:59 回复(0)
一种是用穷举求公倍数,另一种是利用***求最大公约数,再求最小公倍数
import java.util.Scanner;
public class Main {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int[] arrs=new int[5];
        for(int i=0;i<5;i++){
            arrs[i]=sc.nextInt();
        }
        getResult(arrs);
    }

    private static void getResult(int[] arrs) {
        int res=Integer.MAX_VALUE;
        for(int i=0;i<3;i++){
            for(int j=i+1;j<4;j++){
                for(int k=j+1;k<5;k++){
                    res=Math.min(res, fun(arrs[i],arrs[j],arrs[k]));
                }
            }
        }
        System.out.println(res);    
    }
    
    //求三个数的最小公倍数
    private static int fun(int i, int j, int k) {
        return fun3(fun3(i,j),k);
    }

    //求两个数的最小公倍数,穷举法
    private static int fun2(int i, int j) {
        int m=Math.max(i, j);
        int temp=i*j;
        for(int k=m;k<temp;k++){
            if(k%i==0&&k%j==0){
                return k;
            }
        }
        return temp;
    }
    
    //最小公倍数=两数相乘/最大公约数
    private static int fun3(int i,int j){
        return i*j/***(i,j);
    }

    //***求最大公约数
    private static int ***(int i, int j) {
        return j==0?i:***(j, i%j);
    }
    
}

发表于 2019-05-10 20:30:26 回复(0)
import java.util.*;

public class Main {
    public static final int MAX = 105;
    private static int[] arr = new int[5];
    private static final int INT_MAX = 0X3f3f3f;
    private static int fresult = INT_MAX;
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        for (int i=0; i!=5; i++) {
            arr[i] = sc.nextInt();
        }
        solve(0,3,0);
        System.out.println(fresult);
    }

    private static void solve(int cur, int count, int mem) {
        if (5 - cur < count ) { return; }
        if (count == 0) {
            int[] ans = new int[3]; int index = 0;
            for (int i =0; i!=5; i++) {
                if (((mem >> i) & 1) == 1) {
                    ans[index++] = i;
                }
            }
            int result = arr[ans[0]];
            for (int i=1; i!=3; i++) {
                result = getMinCM(result, arr[ans[i]]);
            }
            fresult = Math.min(fresult, result);
            return;
        }
        solve(cur+1, count-1, mem | (1 << cur));
        solve(cur+1, count, mem);
    }

    private static int getMinCM(int a, int b) {
        return a * b / gcd(a, b);
    }

    private static int gcd(int m,int n) {
        if (m % n == 0) { return n; }
        else { return gcd(n,m % n); }
    }
} 
发表于 2019-01-28 22:17:17 回复(0)
1、找出三个整数的组合
2、对每个组合求最小公倍数(先求两个数值的最小公倍数,再和第三个数值求最小公倍数)
3、找到10种组合里边的最小值输出
#include<iostream>
#include<algorithm>
using namespace std;
int func(int a,int b)
{
    int temp1=a,temp2=b,temp=0;
    while(temp2>0)
    {
        temp=temp1%temp2;
        temp1=temp2;
        temp2=temp;
    }
    return a*b/temp1;
}
int main()
{
    int arr[6]={0},a[11]={0},c=1;
    for(int i=1;i<=5;i++)
    {
        cin>>arr[i];
    }
    sort(arr+1,arr+6);
    for(int i=1;i<=3;i++)
    {
        for(int j=i+1;j<=4;j++)
        {
            for(int k=j+1;k<=5;k++)
            {
                a[c]=func(func(arr[i],arr[j]),arr[k]);
                c++;
            }
        }
    }
    sort(a+1,a+11);
    cout<<a[1]<<endl;
}

发表于 2019-04-22 20:37:18 回复(0)
package main

import (
    "fmt"
    "math"
)

func main() {
    arr:=make([]int,5)
    for i:=0;i<5;i++{
        fmt.Scan(&arr[i])
    }
    ans:=math.MaxInt32
    var dfs func([]int,int)
    dfs=func(path []int,idx int){
        if len(path)>=3{
            if len(path)>3{
                return
            }
            x:=f(path[0],path[1],path[2])
            if x<ans{
                ans=x
            }
            return
        }
        for i:=idx;i<5;i++{
            path=append(path,arr[i])
            dfs(path,i+1)
            path=path[:len(path)-1]
        }
    }
    dfs([]int{},0)
    fmt.Print(ans)
}

func f(a,b,c int)int{
    basic:=max(a,max(b,c))
    for i:=basic;;i++{
        if i%a==0&&i%b==0&&i%c==0{
            return i
        }
    }
    return basic
}

func max(a,b int)int{
    if a>b{
        return a
    }
    return b
}

发表于 2023-03-20 13:48:59 回复(0)
#include<iostream>
#include<vector>
#include<algorithm>
int zxgbs(int m,int n)
{
    int c=1;
    int a=0;
    while(m*c%n!=0)c++;
    a=m*c;
    return a;
}
int main()
{
    int a,b,c,d,e;
    while(std::cin>>a>>b>>c>>d>>e)
    {
        
        int f[5]={a,b,c,d,e};
        std::vector<int>t;
        for(int i=0;i<3;i++)
        {
            for(int j=i+1;j<4;j++)
            {
                for(int k=j+1;k<5;k++)
                {
                    int s=zxgbs(zxgbs(f[i], f[j]),zxgbs(f[j], f[k]));
                    t.push_back(s);
                }
            }
        }
        sort(t.begin(),t.end());
        std::cout<<t[0]<<std::endl;
        
    }
    return 0;
}
发表于 2020-08-27 20:47:28 回复(0)
#include<bits/stdc++.h>

using namespace std;

int zxw(vector<int> vi)
{
	int x = 1;
	while (x++)
	{
		int v = 0;
		for (int i = 0; i < vi.size(); i++)
		{
			if (x % vi[i] == 0)v++;
			if (v == 3)return x;
		}
		v = 0;
	}
}
int main(void)
{
	int z = 5, x = 1;
	vector<int> vi;
	while (z--)
	{
		int c;
		cin >> c;
		vi.push_back(c);
	}
	sort(vi.begin(), vi.end());
	cout << zxw(vi);
}
暴力
发表于 2020-04-08 22:14:15 回复(0)
自己的方法比较笨但是还是通过了,
共10个数,三个三个的求最小公倍数共要求10次,在求出的10个数中找出最小的来
求三个数的最小公倍数求法是求任意两对数的最小公倍数a,b,a,b相乘除以他俩的最大公约数


int gcd(int a,int b)
{
    int r;
    if(a<b)
    {
        r=a;a=b;b=r;
    }
    r=a%b;
    while(r!=0)
    {
        a=b;b=r;r=a%b;
    }
    return b;
}
int lcm(int a,int b)
{
    return a*b/gcd(a,b);
}
int way(int a,int b,int c)
{
    int aa=lcm(a,b);
    int bb=lcm(b,c);
    return aa*bb/gcd(aa,bb);
}
int solution(int a,int b,int c,int d,int e)
{
    int array[10];
    array[0]=way(a,b,c);
    array[1]=way(a,b,d);
    array[2]=way(a,b,e);
    array[3]=way(a,c,d);
    array[4]=way(a,c,e);
    array[5]=way(a,d,e);
    array[6]=way(b,c,d);
    array[7]=way(b,c,e);
    array[8]=way(b,d,e);
    array[9]=way(c,d,e);
   
    int min=99999999;
    int i;
    for(i=0;i<10;++i)
    {
        if(array[i]<min)min=array[i];
    }
    return min;
}
int main()
{
    int a,b,c,d,e;
    scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
    printf("%d",solution(a,b,c,d,e));
}


发表于 2020-02-29 11:44:38 回复(0)
import java.util.*;
public class Main {
    public static int Min_divisor(int m,int n){
        int r=m%n;
        while(r>0){
            m=n;
            n=r;
            r=m%n;
        }
        return n;
    }
    public static void main(String args[]){
        Scanner scanner=new Scanner(System.in);
        int[] pt=new int[5];
        for(int i=0;i<5;i++){
            pt[i]=scanner.nextInt();
        }
        Arrays.sort(pt);
        int Min=Integer.MAX_VALUE;
        int m1,m2;
        for(int i=0;i<3;i++){
            for(int j=i+1;j<4;j++){
                for(int k=j+1;k<5;k++){
                    m1=pt[i]/Min_divisor(pt[i],pt[j])*pt[j];
                    m2=m1/Min_divisor(m1,pt[k])*pt[k];
                    Min=Math.min(Min,m2);
                }
            }
        }
        System.out.println(Min);
    }
}

发表于 2019-11-09 20:17:46 回复(0)
#include<iostream>
#include<vector>
#include<algorithm>
#include<cmath>
using namespace std;
int gcd(int x, int y){
    if(y==0) return x;
    return gcd(y, x%y);
}
int getCommonVal(int x, int y, int z){
    vector<int> f(101,0); // 求多个数的最小公倍数的方法,对于每个素数,计算公倍数中其需要出现的最大次数
    int MaxLen = max(x,max(y,z));
    int i=2;
    while(i<=MaxLen){
        int c1=0;
        while(x!=0 && x%i==0){
            x /= i;
            c1++;
        }
        int c2=0;
        while(y!=0 && y%i==0){
            y /= i;
            c2++;
        }
        int c3=0;
        while(z!=0 && z%i==0){
            z /= i;
            c3++;
        }
        f[i] = max(c1, max(c2, c3));
        i++;
    }
    int res = 1;
    for(int i=2; i<=MaxLen; i++)
        res *= pow(i, f[i]);
    return res;
}
int main(){
    vector<int> x(5);
    while(cin>>x[0]>>x[1]>>x[2]>>x[3]>>x[4]){
        int res = 1000000;
        for(int i=0; i<5; i++){
            for(int j=i+1; j<5; j++){
                for(int k=j+1; k<5; k++){
                    res = min(res, getCommonVal(x[i], x[j], x[k]));
                }
            }
        }
        cout<<res<<endl;
    }
    return 0;
}
发表于 2019-03-26 16:30:18 回复(0)
num=list(map(int,input().split()))
minval=min(num)
t=0
while t<3:
    for i in range(5):
        if minval%num[i]==0:
            t+=1
    if t<3:
        t=0
        minval+=1
print(minval)
发表于 2019-03-23 20:04:05 回复(0)
  1. import java.util.*;
    public class Main {
        public static void main(String[] args) {
            Scanner SC = new Scanner(System.in);
            int[] arr = new int[5];
            for (int i = 0; i < 5; i++) {
                arr[i] = SC.nextInt();
            }
            System.out.println(fun(arr));
        }
        static int fun(int[] arr) {
            int cnt = 0;
            for (int i = 1; i <= 1000000; i++) {
                for (int j = 0; j < 5; j++) {
                    if (i % arr[j] == 0) {
                        cnt++;
                    }
                }
                if (cnt >= 3) {
                    return i;
                }
                cnt = 0;
            }
            return 0;
        }
    }

    暴力求解
发表于 2019-03-05 20:28:18 回复(0)
import java.util.Scanner;
import java.math.BigInteger;


public class Main{
    public static void main(String[] args){
        int[] arr = new int[5];
        int end = Integer.MAX_VALUE;
        Scanner sc = new Scanner(System.in);
        for (int idx=0; idx < arr.length; idx++) {
            arr[idx] = sc.nextInt();      
        }
        for (int i = 1; i <= end; i++){
            int count = 0;
            for(int idx = 0; idx < arr.length; idx++){
                if(i%arr[idx] == 0){
                    count++;
                }       
            }
            if(count >= 3){
                System.out.println(i);
                break;
            }
        }                    
    }
    
}

发表于 2019-02-23 17:28:47 回复(0)
如果求a b c的最小公倍数的话,先求出a 和 b 的最小公倍数为d,然后求d和c的最小公倍数。

从5个数里挑3个,10种情况,一一枚举即可。

#include <iostream>

using namespace std;

int get_min_mul(int a, int b) //求两个数的最小公倍数
{
    int bigger, smaller, tmp;
    
    (a > b) ? (bigger = a, smaller = b) : (bigger = b, smaller = a);
    while(smaller != 0)
    {
        tmp = bigger % smaller;
        bigger = smaller;
        smaller = tmp;
    }
    
    return (a * b / bigger);
}

int get_min_mul(int a, int b, int c) //求三个数的最小公倍数
{
    int tmp;
    
    tmp = get_min_mul(a, b);
    
    return get_min_mul(tmp, c);
}


int main(int argc, char *argv[])
{
    int a, b, c, d, e, tmp, ans;
    
    cin >> a >> b >> c >> d >> e;
    ans = get_min_mul(a, b, c);
    tmp = get_min_mul(a, b, d);
    ans = (ans < tmp) ? ans : tmp;
    
    tmp = get_min_mul(a, b, e);
    ans = (ans < tmp) ? ans : tmp;
    
    tmp = get_min_mul(a, c, d);
    ans = (ans < tmp) ? ans : tmp;
    
    tmp = get_min_mul(a, c, e);
    ans = (ans < tmp) ? ans : tmp;
    
    tmp = get_min_mul(a, d, e);
    ans = (ans < tmp) ? ans : tmp;
    
    tmp = get_min_mul(b, c, d);
    ans = (ans < tmp) ? ans : tmp;
    
    tmp = get_min_mul(b, c, e);
    ans = (ans < tmp) ? ans : tmp;
    
    tmp = get_min_mul(b, d, e);
    ans = (ans < tmp) ? ans : tmp;
    
    tmp = get_min_mul(c, d, e);
    ans = (ans < tmp) ? ans : tmp;
    cout << ans << endl;
    
    return 0;
}

发表于 2019-01-29 11:00:07 回复(0)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @author wylu
 */
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] strs = br.readLine().split(" ");
        int[] arr = new int[strs.length];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = Integer.parseInt(strs[i]);
        }

        int res = 0, count = 0;
        while (count < 3) {
            ++res;
            count = 0;
            for (int e : arr) if (res % e == 0) count++;
        }
        
        System.out.println(res);
    }
}

发表于 2019-01-13 17:09:26 回复(0)
#include<stdio.h>
#include<stdlib.h>
intmain()
{
intstr1[5];
inti,k=1,w=0;
for(i=0;i<5;i++)
{
scanf("%d",&str1[i]);
}
 
while(1)
{
if(k%str1[0]==0) w++;
if(k%str1[1]==0) w++;
if(k%str1[2]==0) w++; if(k%str1[3]==0) w++; if(k%str1[4]==0) w++;
if(w>=3)
 
{
 printf("%d",k);
 break;
}
w=0;
k++;
}
}
发表于 2018-12-27 23:36:21 回复(0)