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