由求两个的最大公约数、最小公倍数推广到求N个数的最大公约数,最小公倍数。
CODE:
AC
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.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 == 1) return 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 }
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 == 1) return 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 }