求多个数的最小公倍数的问题

Problem Description

求n个数的最小公倍数。

Input

输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。

Output

为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整数。

Sample Input

2 4 6 3 2 5 7

Sample Output

12 70

#include <stdio.h>
#include <stdlib.h>
typedef long unsigned lu;
lu gcd(lu a,lu b)
{
    int c;
    c=a%b;
    while(c)
    {
        a=b;
        b=c;
        c=a%b;
    }
    return b;
}
lu lcm(lu a,lu b)
{
    return a*b/gcd(a,b);
}
int main()
{
    lu t,n;
    while(scanf("%lu",&t)!=EOF)
    { lu re=1;
        while(t--)
        {
            scanf("%lu",&n);
             re=lcm(re,n);
        }
        printf("%lu\n",re);
    }
    return 0;
}

*最小公倍数与最大公约数的关系:[a1,a2,..,an]=M/(M/a1,M/a2,..,M/an),其中M为a1,a2,..,an的乘积,a1,a2,..,an为正整数。

例如:对于4,6,8,10,有[4,6,8,10]=120,而M=4*6*8*10=1920,M/(M/a1,M/a2,..,M/an) =1920/(6*8*10,4*8*10,4*6*10,4*6*8)=1920/16=120。

*多个数最大公约数的算法实现

求多个数最小公倍数可以转化为求多个数的最大公约数。求多个数的最大公约数(a1,a2,..,an)的传统方法是多次求两个数的最大公约数,即

(1)       用辗转相除法[2]计算a1和a2的最大公约数(a1,a2)

(2)       用辗转相除法计算(a1,a2)和a3的最大公约数,求得(a1,a2,a3)

(3)       用辗转相除法计算(a1,a2,a3)和a4的最大公约数,求得(a1,a2,a3,a4)

(4)       依此重复,直到求得(a1,a2,..,an)

上述方法需要n-1次辗转相除运算。

做此题的关键所在是找出最小公倍数与最大公约数之间的关系,即是abc的最小公倍数=a*b*c/gcd(a,b,c);所以此题又转化为求多个数的最大公约数的问题,利用辗转相除最后求得结果。

时间: 2024-12-15 13:42:37

求多个数的最小公倍数的问题的相关文章

求n个数的最小公倍数(数值范围的控制)

Description 求n个数的最小公倍数. INPUT 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数. OUTPUT 为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行.你可以假设最后的输出是一个32位的整数. SAMPLE INPUT 2 4 6 3 2 5 7 SAMPLE OUTPUT 12 70 解题心得: 本来是很简单的题的,可是由于没有适当的控制算法,导致结果溢出. AC代码: 1 #include<stdio.h> 2 long int

求N个数的最小公倍数

[求N个数的最小公倍数] 1.两两依次求解+提取公因数法. 2.质因数分解法. 例题 2.提取部分公因数法. 3.倍数Trick. 4.幂次Trick.

求两个数的最小公倍数

1.非递归实现(两个数相乘再除以最大公约数) int max_common_doulbe(int a, int b) { int nMax=a>b?a:b; int nMin=a<b?a:b; while(nMin) { int nTmp=nMax%nMin; nMax=nMin; nMin=nTmp; } int nMaxGY=nMax; //最大公约数 return a*b/nMaxGY; } 2. 递归实现 int max_common_doulbe(int a, int b, int

求2个数的最小公倍数和最大公约数

1 # -*- coding: UTF-8 -*- 2 3 def gongyueshu(m, n): 4 if n == 0: 5 return m 6 else: 7 return gongyueshu(n, m%n) 8 9 def gongbeishu(m, n): 10 gongyue = gongyueshu(m, n) 11 return (m * n) / gongyue 12 13 gong = gongyueshu(m=18, n=6) 14 print(gong) 15 g

求N个数的最大公约数和最小公倍数

除了分解质因数,还有另一种适用于求几个较小数的最大公约数.最小公倍数的方法 下面是数学证明及算法实现 令[a1,a2,..,an] 表示a1,a2,..,an的最小公倍数,(a1,a2,..,an)表示a1,a2,..,an的最大公约数,其中a1,a2,..,an为非负整数.对于两个数a,b,有[a,b]=ab/(a,b),因此两个数最小公倍数可以用其最大公约数计算.但对于多个数,并没有[a1,a2,..,an]=M/(a1,a2,..,an)成立,M为a1,a2,..,an的乘积.例如:[2,

HDOJ-ACM1019(JAVA) 多个数的最小公倍数

题意:求多个数的最小公倍数 很简单,但是我一开始的做法,估计会让结果越界(超过int的最大值) import java.util.*; import java.io.*; public class Main{ public static void main(String[] arg){ Scanner scan = new Scanner(new BufferedInputStream(System.in)); int n =scan.nextInt(); int[] nums = new in

两个数的最小公倍数

问题: 求两个数的最小公倍数 #include <stdio.h> #include <stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main(int argc, char *argv[]) { int m, n, b; int temp, k; int lcw; scanf(&q

n个数的最小公倍数

Description 求n个数的最小公倍数. Input 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数. Output 为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行.你可以假设最后的输出是一个32位的整数. Sample Input 2 4 6 3 2 5 7 Sample Output 12 70 #include<stdio.h> int GCD(int num, int x) { if(num%x==0) return x; return G

LightOj1024 - Eid (求n个数的最小公约数+高精度)

题目链接:http://lightoj.com/volume_showproblem.php?problem=1024 题意:给你n(2<=n<=1000)个数, 然后求n个数的最小公倍数,每个数的大小是1---10000;所以答案会很大,可能达到1000个4位数相乘:所以结果很大,将近4000位; 所以一定会涉及到高精度运算:同时我们也不能直接循环求最小公倍数:我们可以把一个数分解成多个质数相乘,然后找到所有数中,出现的质数最多的那个对应的次方,然后再把结果乘起来即可; 例如样例 4 5 6