藍橋杯決賽試題:求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 }

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM