精华内容
下载资源
问答
  • 一种是最容易想到的穷举法:最小公倍数肯定大于等于两个数的最大,因此从最大开始,用循环语句使不断增加,当增加到某个可与i同时整除这两个数时,该则为这两个数最小公倍数。 一种是使用公式a * b=gcd* ...

    最小公倍数的两种求法:

    一种是最容易想到的穷举法:

    • 先考虑特殊情况,当较大数是较小数的整数倍时,
    • 两个数互质时,可直接快速得出最小公倍数。
    • 一般情况:最小公倍数肯定大于等于两个数的最大数且肯定为较大数的整数倍,因此从最大数开始,用循环语句使不断增加最大数的整数倍,当增加到某个整数倍时可与同时整除这个较小数时,该较大数的整数倍数则为这两个数的最小公倍数。

    一种是使用公式a * b=gcd* lcm ,两数之积等于这两个数的最小公倍数和最大公约数的

    注:

    • gcdlcm代表a和b最大公约数和最小公倍数;
    • 该公式仅用于计算两个数的gcd和lcm,对多个数不成立;
    • 上述穷举法中的特殊情况也可由此公式验证

    公式证明:假设两个数a和b,它们的最大公约数是:gcd
    那么设:a=k1gcd ; b=k2gcd ;
    因为gcd为a和b的最大公约数 ,故k1和k2互质,所以k1和k2的最小公倍数为k1k2;(上述穷举法中有提到)
    那a和b的最小公倍数lcm=k1k2gcd=(a/gcd)(b/gcd)gcd;
    可得公式lcm
    gcd=a
    b ;

    代码实现:
    想了解求最大公倍数的算法可戳:最大公约数的三种算法

    #include<stdio.h>
    void Least_common_multiple1(int a, int b);//穷举法
    void Least_common_multiple2(int a,int b);//最大公倍数法
    int Greatest_common_divisor(int a, int b);
    void swap(int *x, int *y);
    int main()
    {
    	int a, b;
    	printf("请输入a,b的值:");
    	scanf("%d%d", &a, &b);
    	if (a == 0 || b == 0)
    	{
    		printf("0没有最小公倍数!,请重新输入:");
    		scanf("%d%d", &a, &b);
    	}
    	Least_common_multiple1(a, b);
    	Least_common_multiple2(a, b);
    	system("pause");
    	return 0;
    }
    void Least_common_multiple1(int a, int b)//穷举法
    {
    	if (a<b)
    	{
    		swap(&a,&b);
    		if (0 == a%b)
    		{
    			printf("%d\n", a);//当较大数可以整除较小数时,较大数即为这两个数的最小公倍数
    		}
    	}
    	if (1 == Greatest_common_divisor(a, b))//考虑到两个数互为质数时,最小公倍数为两个数的积(可由公式a*b=gcd*lcm;gcd=1得)
    	{
    		printf("%d\n", a*b);
    	}
    	int t = a > b ? a : b;
    	for (int i = t;; i+=t)
    	{
    		if ((i%a == 0) && (i%b == 0))
    		{
    			printf("%d\n", i);
    			break;
    		}
    	}
    }
    void Least_common_multiple2(int a,int b)
    {
    	printf("%d\n", a*b / Greatest_common_divisor(a, b));
    }
    int Greatest_common_divisor(int a, int b)
    {
    	a = abs(a);
    	b = abs(b);
    	if (a < b)
    	{
    		swap(&a, &b);
    	}
    	while (b)
    	{
    		int t = a%b;
    		a = b;
    		b = t;
    	}
    	return a;
    }
    void swap(int *x, int *y)
    {
    	int t = *x;
    	*x = *y;
    	*y = t;
    }
    

    求多个数的最小公倍数

    递归:

    分析:先求得出前面数的最小公倍数,再不断将这个数与后面做最小公倍数运算,直至求完每一个数。
    代码实现:

    #include<stdio.h>
    #define max 4
    void set_array();//设置数组
    void print_array();//打印数组
    void swap(int *x, int *y);//交换两数的值
    int Least_common_multiple(int a,int b);//求两个数的最小公倍数
    int Greatest_common_divisor(int a, int b);//求两个数的最大公倍数
    
    int main()
    {
    	int array[max];
    	set_array(array);
    	print_array(array);
    	int lcm=array[0];
    	for (int i = 1; i < max; i++)
    	{
    		lcm=Least_common_multiple(lcm, array[i]);
    	}
    	printf("\n%d\n", lcm);
    	return 0;
    }
    void set_array(int *p)
    {
    	for (int i = 0; i < max; i++)
    	{
    		scanf("%d",&p[i]);
    	}
    }
    void print_array(int *p)
    {
    	for (int i = 0; i < max; i++)
    	{
    		printf("%d\t",p[i]);
    	}
    }
    int Greatest_common_divisor(int a, int b)
    {
    	if (a < b)
    	{
    		swap(&a, &b);
    	}
    	while (b)
    	{
    		int t = a%b;
    		a = b;
    		b = t;
    	}
    	return a;
    }
    void swap(int *x, int *y)
    {
    	int t = *x;
    	*x = *y;
    	*y = t;
    }
    int Least_common_multiple(int a, int b)
    {
    	return a*b / Greatest_common_divisor(a, b);
    }
    
    

    穷举法:

    分析:一组数的最小公约数肯定在这组数的最大值和这组数的乘积之间;故从最大值开始穷举,当某个数可以整除这组所有数时,即得到这组数的最小公倍数。
    代码实现:

    #include<stdio.h>
    #include<stdbool.h>
    #define max 4
    void Set_array(int *p);//设置数组
    void Print_array(int *p);//打印数组
    bool Determine_divisible(int *p, int lcm);//判断lcm是否可以整除p中所有数
    int Max_num(int *p);//返回这组数中的最大值
    
    int main()
    {
    	int array[max];
    	Set_array(array);
    	Print_array(array);
    	int lcm = Max_num(array);
    	for (int i = lcm;; i++)
    	{
    		if (Determine_divisible(array,i ))
    		{
    			printf("这组数的最小公倍数为:%d\n", i);
    			break;
    		}
    	}
    	for (int i = array[0];; i++)
    	{
    		if (Determine_divisible(array, i))
    		{
    			printf("这组数的最小公倍数为:%d\n", i);
    			break;
    		}
    	}
    	return 0;
    }
    void Set_array(int *p)
    {
    	for (int i = 0; i < max; i++)
    	{
    		scanf_s("%d", &p[i]);
    	}
    }
    void Print_array(int *p)
    {
    	for (int i = 0; i < max; i++)
    	{
    		printf("%d\t", p[i]);
    	}
    }
    bool Determine_divisible(int *p,int lcm)
    {
    	for (int i = 0; i < max; i++)
    	{
    		if (lcm%p[i]!= 0)
    		{
    			return false;
    		}
    	}
    	return true;
    }
    int Max_num(int *p)
    {
    	int t=p[0];
    	for (int i = 0; i < max; i++)
    	{
    		t = t>p[i] ? t : p[i];
    	}
    	return t;
    }
    
    展开全文
  • 有了公式,我们很清楚可以知道了,只要有最大公约数就可以最小公倍数,因为两乘积肯定是已知的,所以下面将讲解一下两个数如何最大公约数。 1.辗转相除法(方法有很,只介绍我会的,并且易懂的h...

                                   最小公倍数


       既然想算最小公倍数,首先要清楚最小公倍数的求法,还有最大公约数的求法

       最小公倍数*最大公约数=两数乘积

     有了公式,我们很清楚可以知道了,只要有最大公约数就可以求出最小公倍数,因为两数乘积肯定是已知的,所以下面将讲解一下两个数如何求最大公约数

    1.辗转相除法(方法有很多,只介绍我会的,并且易懂的hhhh)

     

    辗转相除法, 又名欧几里德算法(Euclidean algorithm),是求最大公约数的一种方法。它的具体做法是:

    用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是0为止。如果是求两个数的最大公约数,那么最后的除数就是这两个数的最大公约数。

    好吧,定义总是那么的复杂且难懂,下面直接一张表格,实现一遍辗转相除法,聪明的你肯定一遍就看会!

                   15                              55
                               15=15%55
                               10=55%15
                                5=15%10
                                0=10%5(最大公约数 5 )

    如果你看懂了两个数如何求最小公倍数,那么求多个数的最小公倍数就不难了。

    主要就是遵循一个准则:

    先求前两个数的最小公倍,再用这个最小公倍数与下一个数求最小公倍数

    再举一个例子求一下(5 7 15) 的最小公倍数
     

    字迹可能有些潦草,但是很认真哈哈哈哈哈哈!

    如果大致过程会了,代码肯定是会了

    代码实现:

    
    import java.math.BigInteger;
    import java.util.*;
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            while (n-- > 0) {
                int k = sc.nextInt();
                int sum = 1;
                for (int i = 0; i < k; i++) {
                    int p = sc.nextInt();
                    sum *=  p / ff(sum, p);
                }
                System.out.println(sum);
            }
        }
        public static int ff(int x,int y){
            int r ;
            while(y!=0){
                r=x%y;
                x=y;
                y=r;
            }
            return x;
    
        }
        }
    

    没有考虑大数的问题,根据题意选择long还是int。

    下面介绍一个杭电oj的题目,因为你即使看的再懂不去实践也是不行的!

    比如杭电的2028!

                                                  总结

    大家共同学习,写错的地方请提出谢谢。

     

     

     

    展开全文
  • 多个数求最小公倍数

    2016-12-11 20:29:06
    思路:求多个数最小公倍数的思想:先出两个最小公倍数,然后将他们的最小公倍数与第三个数求最小公倍数,由此递推求多个数最小公倍数。#include #include using namespace std; int gcd(int x,int y) //两...
    求多个数的最小公倍数的思想:先求出两个数的最小公倍数,然后将他们的最小公倍数与第三个数求最小公倍数,由此递推求多个数的最小公倍数。
    #include<iostream>
    #include<cstdio>
    using namespace std;
    int gcd(int x,int y)   //求两个数的最大公约数
    {
        int r;
        r=x%y;
        while(r!=0)
        {
            x=y;
            y=r;
            r=x%y;
        }
        return y;
    }
    int mulgcd(int a[],int n)  //求多个数的最小公倍数,n为数组的大小
    {
        int x,y,num=a[0],i,g;
        for(int i=1;i<n;i++)
        {
            x=num;
            y=a[i];
            g=gcd(x,y);
            num=x/g*y;
        }
        return num;   //返回最小公倍数
    }

    展开全文
  • 求多个数最小公倍数 ZSTU Description n个整数的最小公倍数 Input 多组测试数据,先输入整数T表示组 然后每行先输入1个整数n,后面输入n个整数k1 k2...kn Output k1 k2 ...kn的...

    求多个数的最小公倍数

    ZSTU

    Description
    求n个整数的最小公倍数
    Input
    多组测试数据,先输入整数T表示组数 然后每行先输入1个整数n,后面输入n个整数k1 k2…kn
    Output
    求k1 k2 …kn的最小公倍数
    Sample Input
    1
    3 12 18 6
    6

    #include<stdio.h>
    int gb(int x,int y)
    {
        int t=1,temp;
        if(x<y)
        {
         	temp=x;
        	x=y;
         	y=temp;
        }
        while(t)
        {
            t=x%y;
            x=y;
            y=t;
        }
        return x;
    }
    int gbs(int s[],int n)  
    {
        int m,i;
        for(i=0;i<n-1;i++)
        {
            m=gb(s[i],s[i+1]);
            s[i+1]=s[i]/m*s[i+1];	//否则会RE
        }
        return s[n-1];
    } 
    int main()
    {
        int t,n,m,i;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            int s[10000];
            for(i=0;i<n;i++)        
       		scanf("%d",&s[i]);
      	if(n==1)
       		printf("%d\n",s[0]);
      	else
      	{
      		for(i=0;i<n-1;i++)
              	m=gbs(s,n);
       		printf("%d\n",m);
            }
        }
    }
    
    展开全文
  • 多个数求最大公约数和最小公倍数 问题描述 N个的最大公约数和最小公倍数,提供友好的输入输出,并进行输入数据的正确性验证 解题思路 N个的最大公约数最小公倍数求解首先在输入数据时应该是无限的,用一个...
  • Python 求多个数最小公倍数

    千次阅读 2019-07-24 10:21:29
    Python 求多个数最小公倍数 def mcm(*num): minimum = 1 for i in num: minimum = int(i) * int(minimum) / m.gcd(int(i), int(minimum)) return int(minimum)
  • 多个数最小公倍数

    2018-01-11 19:00:18
    输入多个数求这个最小公倍数。 输入: 输入包含多组测试数据,每组数据的第一行为输入数据的个数n(n 输出: 输出为n个最小公倍数。 输入样例: 3 2 6 9 0 输出样例: 18 代码如下: #include ...
  • 出前两个数出的最小公倍数与第三个数(min和arr[2])的最小公倍数,此时得到的最小公倍数就是数组前3个数最小公倍数,以此类推。 代码如下: smallestCommons(arr) { var minCom = arr[0] // 当前最小公倍数 ...
  • 思路:按照个数最小公倍数思想,边输入边计算。利用公式 两个数最小公倍数=两个数的乘积 / 两个数的最大公因数(在本题中先除再乘,防止数据溢出);最大公因数采用辗转相除法。 #include<iostream>...
  • 那么如何求多个数最小公倍数呢,道理也是一样,两两求最小公倍数,然后再拿这个结果去和别的数求最小公倍数就行了,详解见https://www.luogu.com.cn/blog/zzj/ti-xie-p4057-chen-pao-post 其实这是水题,毕竟普及难度,...
  • 数学算法:求多个数最小公倍数

    万次阅读 2017-03-25 10:16:30
    2、运用小学奥数的算法,多个数最小公倍数,先将两个最小公倍数求出,再与后面的数求最小公倍数。两个最小公倍数,可以先将两个相乘再除两个的最小公因数。为了避免溢出,可以先相除再相乘。题目:...
  • 今天参加腾讯笔试,做编程题时在最小公倍数、最大公约数这些这么简单的知识点上卡壳了,...3、个数最小公倍数,两个数最小公倍数与它们的最大公约数之间存在如下关系: 某两个数a,b的最小公倍数=(a*b)/a与b...
  • n个数最小公倍数

    千次阅读 多人点赞 2017-10-29 18:23:58
    n个数最小公倍数 【输入描述】 第一行一个数n(n 下面n个数,integer范围内 【输出描述】 这n个数最小公倍数 【样例输入】 5 6 3 5 4 2 【样例输出】 60 【数据范围及提示】 出最大...
  • 2043: 最小公倍数时间限制: 1 Sec 内存限制: 64 MB提交: 11 解决: 9您该题的状态:已完成[提交][状态][讨论版]题目描述为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致。但也并非纯粹的偶然:60...
  • JAVA求多个数最小公倍数

    千次阅读 2017-02-28 18:27:53
    n个最小公倍数。 Input 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。 Output 为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的...
  • 1、求最小公倍数,一,读,读,几个数公有的倍数,叫做它们的公倍数,其中最小的公倍数,叫做它们的最小公倍数,说出下列各组最小公倍数。(口答,12和4,6和18,10和70,第一组,12,18,70,倍数关系:最小公倍数是大数,倍数...
  • 最大公约数和最小公倍数的有效算法有下面3种, 我们对HDOJ1019进行分析,该题要求m个数最小公倍数
  • def Common_multiple(number1, number2): # 两个最小公倍数 while number1 % number2 !...def Maximum_common_divisor(*number): # 任意多个数最小公倍数 while len(number) > 1: numbe...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,585
精华内容 5,834
关键字:

多个数求最小公倍数方法