首页 > 试题广场 >

求最小公倍数

[编程题]求最小公倍数
  • 热度指数:360783 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
正整数A和正整数B 的最小公倍数是指 能被A和B整除的最小的正整数值,设计一个算法,求输入A和B的最小公倍数。

数据范围:

输入描述:

输入两个正整数A和B。



输出描述:

输出A和B的最小公倍数。

示例1

输入

5 7

输出

35
示例2

输入

2 4

输出

4
while True:
    try:
        a,b = map(int,input().split())
        if a%b==0:   #先讨论b是a的因子的情况
            print(a)
        elif b%a==0: #a是b的因子的情况
            print(b)
        else:
            factor=1  
            for i in range(max(a,b),1,-1): #从a和b中较大的一个开始试因子,直到2,倒叙
                if a%i==0 and b%i==0:
                    factor *= i #公因子累积
                    a=a/i #a和b分别除以公因子
                    b=b/i
                else:
                    continue
            result=int(a*b*factor)  #除以所以公因子后的a和b,乘所有公因子之积
            print(result)
    except:
        break
                    

发表于 2021-10-27 06:18:56 回复(0)
using System;

namespace 最小公倍数
{
    class Program
    {
        static void Main(string[] args)
        {
            string line;
            while((line=Console.ReadLine())!=null)
            {
                string[] Array = line.Split(" ");
                int num1 = Convert.ToInt32(Array[0]);
                int num2 = Convert.ToInt32(Array[1]);
                int tmp;
                if (num1 < num2)
                {
                    tmp = num1; num1 = num2; num2 = tmp;
                }
                int a = num1; int b = num2;
                while (b != 0)
                {
                    tmp = a % b;
                    a = b;
                    b = tmp;
                }
                Console.WriteLine(num1 * num2 / a);
            }
        }
    }
}
发表于 2021-10-21 15:01:50 回复(0)
import java.util.*;
public class Main{
    public static void main(String[]args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int a=sc.nextInt();
            int b=sc.nextInt();
            int max=a>b?a:b;
            int x=max;
            for(;;x+=max){
                if(x%a==0 && x%b==0){
                    System.out.println(x);
                    return;
                }
            }
        }
    }
}


发表于 2021-10-17 15:26:33 回复(0)
import java.util.Scanner;

//暴力法,时间复杂度高
// public class Main{
//     public static void main(String[] args){
//         Scanner sc = new Scanner(System.in);
//         while(sc.hasNext()){
//             int a = sc.nextInt();
//             int b = sc.nextInt();
//             int res = 0;
//             if(a>b) res=fun(b, a);
//             else if(a<b) res=fun(a, b);
//             else res=a;
//             System.out.println(res);
//         }
//     }
    
//     private static int fun(int a, int b){
//         for(int i=b; i<=a*b; i++){
//             if(i%a==0 && i%b==0) return i;
//         }
//         return 0;
//     }
// }

//辗转相除法求最大公约数gbc(a,b)= gbc(b, a%b);,最小公倍数=两数乘积 / 最大公约数
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            int a = sc.nextInt();
            int b = sc.nextInt();
            System.out.println((a*b)/gcb2(a, b));
        }
    }
    
    //递归写法gbc(a,b)= gbc(b, a%b)
    private static int gcb1(int a, int b){
        if(b==0) return a;
        
        //后面递归b大,a%b小,所以b先达到0
        return gcb1(b, a%b);
    }
    
    //迭代写法
    private static int gcb2(int a, int b){
        while(b>0){
            int temp = a%b;
            a = b;
            b = temp;
        }
        return a;
    }
}

发表于 2021-08-17 14:37:31 回复(0)
#include<stdio.h>

int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    for(int i=a;i<=a*b;i++)
    {
        if(i%a==0 && i%b ==0)
        {
            printf("%d",i);
            break;
        }
    }
    return 0;
}

发表于 2021-08-16 23:09:58 回复(0)
a,b=map(int,input().split())
l=[]
for i in range(1, min(a, b)+1):
    if a % i == 0 and b % i == 0:
        l.append(i)
print(a*b//max(l))
发表于 2021-07-11 01:19:06 回复(1)
#include <stdio.h>
int main()
{
    int a,b,result,text,i=1,max,min;
    scanf("%d%d",&a,&b);
    max=a>b?a:b;
    min=a<b?a:b;
    while(1)
    {
        text=i*max;
        if(text%min==0)
            break;
        i++;
    }
    printf("%d\n",text);
    return 0;
}
发表于 2021-06-16 19:12:27 回复(0)
/**
Swift 没有使用递归调用的版本

思路:老老实实按照语文老师教的写了个 栈,把每次的公约数压了进去,最后除不尽时再将两位数字一起压入。解法可用于求最小公约数~
*/

while let value = readLine() {
    print("\(solution(value))")
}

func solution(_ inputStr: String) -> Int {
    let numArray = inputStr.split(separator: " ")
    var numA = Int(numArray[0]) ?? 0
    var numB = Int(numArray[1]) ?? 0
    
    var numStack = [Int]()
    
    var count = 2
    while count <= max(numA, numB) {
        
        if numA % count == 0, numB % count == 0 {
            numStack.append(count)
            numA /= count
            numB /= count
            
            // 达到最小值情况提前退出
            if count >= min(numA, numB) {
                numStack.append(numA)
                numStack.append(numB)
                break
            }
            
            continue
        
        } else if numA % count == 0 {
            numStack.append(count)
            numA /= count
            
        } else if numB % count == 0 {
            numStack.append(count)
            numB /= count
        }
        
        if count >= min(numA, numB) {
            numStack.append(numA)
            numStack.append(numB)
            break
        }
        count += 1
    }
    return numStack.reduce(1) { $0 * $1 }
}

发表于 2021-04-05 22:16:53 回复(0)
def gcd(a, b):
    """Return greatest common divisor using Euclid's Algorithm."""
    while (a % b != 0):
        t = a % b
        a = b  # 新的a用原来的b值
        b = t  # 新的b用原来的余数值
    return b  # 若a除以b能整除,则b就是两个数的最大公约数。
# 首先,从键盘键入两个数a和b的值,变量t来保存余数。用while循环来判断能否整除,根据“辗转相除法”,先用第一个数a÷b再将除数b赋给a,
# 余数赋给b,循环往复,直到能整除时结束循环,此时的除数b即为最大公约数。

def lcm(a, b):
    """Return lowest common multiple."""
    return a * b // gcd(a, b)


while True:
    try:
        a, b = map(int, input().split())
        print(lcm(a, b))
    except:
        break

 特别说明:a<b,例如a=18b=99t=a%b=18%99=18;新的a用原来的b————a=99;新的b用原来的余数值b=t=18我们发现通过一次循环交换了ab的值,这时就能满足a>b的条件了,再继续根据辗转相除的方法即可得到最大公约数。因此,无须顾及输入的两个整数ab谁大谁小。
编辑于 2020-12-24 12:09:50 回复(0)
import sys


def gcd(a, b):
    while b:
        a, b = b, a%b
    return a


def lcm(a, b):
    return a*b//gcd(a, b)


for s in sys.stdin:
    a, b = map(int, s.split())
    print(lcm(a, b))

发表于 2020-12-19 19:14:11 回复(0)
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String str;
        while((str=br.readLine()) != null) {
            String[] inArr = str.split(" ");
            int a = Integer.parseInt(inArr[0]);
            int b = Integer.parseInt(inArr[1]);
            int max = a*b;
            int min = Math.max(a, b);
            for(int i=min; i<=max; i++) { //肯定在两者大的那个 和 两者的乘积之间(闭区间)
                if(i%a==0 && i%b==0) {
                    System.out.println(i);
                    break;
                }
            }
        }
    }
}
发表于 2020-09-20 01:15:14 回复(0)

Java 欧几里得公式

思路

利用欧几里得公式进行计算;

实现

import java.util.Scanner;

/**
 * @author : cunyu
 * @version : 1.0
 * @className : OneZeroEight
 * @date : 2020/8/8 22:41
 * @description : 108.求最小公倍数
 */

public class OneZeroEight {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        while (input.hasNext()) {

            int m = Integer.parseInt(input.nextLine().split(" ")[0]);
            int n = Integer.parseInt(input.nextLine().split(" ")[1]);
            System.out.println(getLcm(m, n));
        }
    }

    /**
     * @param m
     * @param n
     * @return
     * @description 求最大公约数
     * @date 2020/8/8 22:50
     * @author cunyu1943
     * @version 1.0
     */
    public static int getGcd(int m, int n) {
        while (n > 0) {
            int tmp = m % n;
            m = n;
            n = tmp;
        }
        return m;
    }

    /**
     * @param m
     * @param n
     * @return
     * @description 求最小公倍数
     * @date 2020/8/8 22:50
     * @author cunyu1943
     * @version 1.0
     */
    public static int getLcm(int m, int n) {
        return m * n / getGcd(m, n);
    }
}
发表于 2020-08-08 22:57:36 回复(0)
def Num(a,b):
    for i in range(min(a,b),(a*b+1)):
        if i%a == 0 and i%b == 0:
            print(i)
            break
            
a = int(input('A:'))
b = int(input('B:'))
Num(a,b)

为什么提交通过率是0%啊,在IDLE上没错啊
发表于 2020-08-02 15:12:55 回复(1)
import java.util.*;


public class Main{
    
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        
        int a = scanner.nextInt();
        int b = scanner.nextInt();
        System.out.println(a*b/fun(a,b));
    }
 
    public static int fun(int min,int max){
        if(min>max){
            min = min^max;
            max = min^max;
            min = min^max;
        }
        
        int k;
        while(min!=0){
            k = max%min;
            max = min;
            min = k;
        }
        return max;
    }
    
    
}





发表于 2020-08-01 12:10:54 回复(0)
//来试试这个,小学生挨着试解法  用时3ms,504K内存
#include <iostream>
using namespace std;
int func(int a,int b)
{
    int i = 0;
    int m = 0;
    while(1)
    {
        i++;
        m = a*i;
        if(m%b==0)
        {
            break;
        }
    }
    return m;
}

int main()
{
    int a,b,result;
    scanf("%d %d",&a,&b);
    result = func(a,b);
    std::cout<<result;
    return 0;
}


编辑于 2020-07-27 22:58:20 回复(0)
//两数比较大小,两个数的最小公倍数一定在[min,2*min,3*min,...  , max*min]中
#include <iostream>
using namespace std;

#define min(x,y) ((x)<(y) ? (x):(y))
#define max(x,y) ((x)>(y) ? (x):(y))

int LowestCommonMultiply(int a, int b)
{
    int small = min(a,b);
    int big = max(a,b);
    for (int i = 1; i < big;i++)
    {
        if((small*i)%b == 0)
        {
            return (small*i);
        }
    }
    return a*b;
}

int main()
{
    int ret;
    int a,b;
    cin>>a>>b;

    ret = LowestCommonMultiply(a,b);
    cout<<ret;

    return 0;
}


发表于 2020-07-24 12:54:34 回复(0)
'''
python 代码求解
正解:先求公约数,再求公倍数
暴力:a,b的最小公倍数 must <=a*b ,所以只要遍历 2~a*b 即可
'''

a,b = map(int,input().split())
num = a if a>b else b
for i in range(2,num+1):
    if (a%i==0) and (b%i==0):
        num = i
        break
if num==(a if a>b else b):
    print(a*b)
else:
    print(int(a*b/num))

发表于 2020-07-15 11:16:52 回复(1)
最小公倍数 = (A*B)/(A和B的最大公约数
#include<iostream>
using namespace std;
 
int max_gongyueshu(int A, int B)
{
    int Mgongyueshu = 1;
    for(int i = 1; i <= A && i <= B; i++)
    {
        if(A % i == 0 && B % i == 0)
        {
            Mgongyueshu = i;
        }
    }
    return Mgongyueshu;
}
 
int main()
{
    int A, B;
    cin >> A >> B;
    int max_gys = max_gongyueshu(A, B);
    cout << (A*B)/max_gys << endl;
    return 0;
 
}


发表于 2020-07-11 15:45:54 回复(0)
import java.util.Scanner;
/**
*辗转相减法,求最小公约
/
public class Main {
    public static int getResult(int m ,int n){
        while(m != n){
            int temp;
            if(m < n){
             //位移运算交换
                m = n^m;
                n = n^m;
                m = n^m;
            }
            m = m - n;
        }
        return m;
    }
    public static void main(String[] args) {
        Scanner reader = new Scanner(System.in);
        while(reader.hasNext()){
            int m = reader.nextInt();
            int n = reader.nextInt();
            System.out.println(m*n/getResult(m, n));
        }
    }
}
发表于 2020-07-09 16:24:51 回复(0)
// 能运行通过,抄的别人的不懂,求解!!!
function LCM (n,m) {
    if(m === 0) returnn;
    returnLCM(m,n%m)
}
function GCD (n,m) {
    constmax = LCM(n,m)
    returnn*m/max
}
while(line=readline()){
    var lines = line.split(' ');
    var a = parseInt(lines[0]);
    var b = parseInt(lines[1]);
    print(GCD(a,b));
}
发表于 2020-06-18 14:19:51 回复(2)

问题信息

难度:
964条回答 79842浏览

热门推荐

通过挑战的用户

查看代码
求最小公倍数