蓝桥杯决赛试题:求1到n的最小公倍数

为什么1小时有60分钟,而不是100分钟呢?这是历史上的习惯导致。
但也并非纯粹的偶然:60是个优秀的数字,它的因子比较多。
事实上,它是1至6的每个数字的倍数。即1,2,3,4,5,6都是可以除尽60。
1  2  3  4  5  6

我们希望寻找到能除尽1至n的的每个数字的最小整数。

不要小看这个数字,它可能十分大,比如n=100, 则该数为:
6972 0375 2297 1247 7164 5338 0893 5312 3035 5680 0

请编写程序,实现对用户输入的 n (n<100)求出1~n的最小公倍数。

例如:
用户输入:
6
程序输出:
60

用户输入:
10
程序输出:
2520

 

 1 #include <stdio.h>
 2 #include <math.h>
 3 #include <stdlib.h>
 4 #define MAX 100000
 5 #define N 101
 6 void init(double *r)
 7 {
 8     int i;
 9     for (i=0; i<N; i++)
10         r[i]=0;
11 }
12 void cpy(double *r,double *t)
13 {
14     int i;
15     for (i=0; i<N; i++)
16         t[i]=r[i];
17 }
18 void add(double *r,double *t)
19 {
20     int i;
21     double carry=0;
22     for (i=N-1; i>=0; i--)
23     {
24         r[i] = r[i]+t[i]+carry;
25         if (r[i] >= MAX)
26         {
27             r[i] -= MAX;
28             carry = 1;
29         }
30         else
31         {
32             carry = 0;
33         }
34     }
35 }
36 int mod(double *r,double b)
37 {
38     int i;
39     double tmp,remain=0,xx;
40     for (i=0; i<N; i++)
41     {
42         tmp = r[i]+remain;
43         xx = modf(tmp/b,&r[i]);
44         remain = fmod(tmp,b)*MAX;
45     }
46     return xx?1:0;
47 }
48 
49 void main()
50 {
51     double n,r[N],a[N],b[N],i;
52     int j=0;
53     init(r);
54     scanf("%lf",&n);
55     r[N-1]=n;
56     for (i=n-1;i>=n/2;i--)
57     {
58         cpy(r,a);cpy(r,b);
59         while(mod(a,i)!=0)
60         {
61             add(r,b);
62             cpy(r,a);
63         }
64     }
65     while (r[j] == 0)         j++;
66     printf("%.0lf",r[j++]);
67     while (j<N-1)        printf("%05.0lf",r[j++]);
68     printf("\n");
69 }

 

 

posted @ 2012-03-30 22:43  ZH奶酪  阅读(4356)  评论(6编辑  收藏  举报