為什么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 }
