Hdu 1019 Least Common Multiple

由求两个的最大公约数、最小公倍数推广到求N个数的最大公约数,最小公倍数。

CODE:

AC 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include < string.h> 

 4

 5 __int64 gcd(__int64 a , __int64 b)
 6 {
 7     return b==0?a:gcd(a , b);
 8 }
 9 
10 int main()
11 {
12     __int64 n , m , a , b;
13     scanf("%I64d", &n);
14     while(n--)
15     {
16         scanf("%I64d", &m);
17         a=1;
18         while(m--)
19         {
20             scanf("%I64d", &b);
21             a = a / gcd(a,b)*b;
22         }
23         printf("%I64d\n", a);
24     }
25     return 0;

26 } 

 

 

 顺便贴下我TLE的递归代码,两次递归伤不起啊!!!

 CODE:

 TLE

 1 #include < string.h>
 2 #include <stdlib.h>
 3 #include <math.h>
 4 #include <stdio.h>
 5   using  namespace std;
 6  
 7  
 8   const  int maxn =  100001
 9  __int64 a[maxn];
10  __int64 b[maxn];
11  
12  
13  __int64 gcd(__int64 a , __int64 b)                     // 递归求最小公约数 
14   {
15       return b== 0?a:gcd(b , a%b);
16  }
17  
18  
19  
20  __int64 gcgn(__int64 a[] , __int64 n)                   // 递归求N个数的最小公倍数 
21   {
22       if(n ==  1 )  return a[ 0] / gcd(a[ 0] , a[ 1]) * a[ 1];  // 边界处理 
23        else
24      {
25          b[ 0] = a[ 0] / gcd(a[ 0] , a[ 1]) * a[ 1];
26           for( int i =  1; i < n -  1; i++)
27          {
28              b[i] = a[i+ 1];
29          }
30           return gcgn(b , n- 1);
31      }
32  }
33  
34  __int64 gcdn(__int64 a[] , __int64 n)                 // 递归求N个数的最大公约数 
35   {
36       if(n ==  1return gcd(a[ 0] , a[ 1]);  // 边界处理 
37        else
38      {
39          b[ 0] = gcd(a[ 0] , a[ 1]);
40           for( int i =  1 ; i < n -  1; i++)
41          {
42              b[i] = a[i +  1];
43          }
44           return gcdn(b , n -  1);
45      }
46  }
47  
48  
49  
50   int main()
51  {
52       int t ;
53       while(~scanf( " %d ", &t)){
54       while(t--)
55      {
56          memset(a ,  0 , sizeof(a));
57          memset(b ,  0 , sizeof(b));
58          __int64 n;
59           scanf( " %I64d ", &n);
60           for(__int64 i =  0 ; i < n ; i++) 
61            scanf( " %I64d ", &a[i]);
62          if(a[ 0] ==  0 || a[ 1] ==  0) { printf( " 0\n ");  break;}
63           int a1 = gcgn(a , n);
64          printf( " %I64d\n ", a1);
65      }
66  }
67       return  0;
68  }

你可能感兴趣的:(com)