求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 digit[1002];
 3 int f(int a,int b)//寻找a,b最小公倍数
 4 {
 5     int max,min;
 6     if(a>b){
 7         max=a;
 8         min=b;
 9     }
10     else
11     {
12         max=b;
13         min=a;
14     }
15     while(1){
16         int temp=max%min;
17         if(!temp) return ((long int)a*(double)(b/min));
18         //上面必须先除以min然后才乘以a,要不然要溢出
19         max=min;
20         min=temp;
21     }
22 }
23 void ans(int x)//递归求最小公倍数,循序渐进,类似二分
24 {
25     if(x==1)
26         return;
27     int i,k=0;
28     for(i=0;i<x-1;i+=2)
29         digit[k++]=f(digit[i],digit[i+1]);
30     if(x%2)
31         digit[k++]=digit[x-1];
32     ans(k);
33 }
34 int main()
35 {
36     int n;
37     while(scanf("%d",&n)!=EOF){
38         int i;
39         for(i=0;i<n;i++)
40             scanf("%ld",&digit[i]);
41         ans(n);
42         printf("%ld\n",digit[0]);
43     }
44     return 0;
45 }

分析图片:

时间: 2024-10-26 04:01:40

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

求N个数的最小公倍数

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

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

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

求两个数的最小公倍数

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