#include<stdlib.h> #include<stdio.h> int *data; int main() { void lcm(int n); int m; int n; int i; scanf("%d",&m); while(m--) { scanf("%d",&n); data=(int *)malloc(sizeof(int)*(n+1)); for(i=0;i<n;i++) scanf("%d",&data[i]); lcm(n); free(data); } } void lcm(int n) //求n个数的最小公倍数 { int gcd ( int a,int b ); int i,j; int tem; int now=data[0]; for(i=1;i<n;i++) { tem=gcd(now,data[i]); now=now/tem*data[i]; } printf("%d\n",now); } int gcd ( int a,int b ) //求两个数的最大公约数 { int temp; if (a<b) { temp=a; a=b; b=temp; } if ( a % b == 0) return b; else return gcd ( b,a % b) ; }
链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1797
求多个数的最小公倍数。现在我们对于两个数,他们的最小公倍数和最大公约数有如下关系:
设两个数是a,b最大公约数是p,最小公倍数是q
那么有这样的关系:ab=pq
而最大公约数可以用辗转相除发求。
解题思路是这样的:先求前两个数的最小公倍数q,再求q与第三个数的最小公倍数,覆盖掉原来的q值,,,,,依次下去.................
#include<stdlib.h> #include<stdio.h> int *data; int main() { void lcm(int n); int m; int n; int i; scanf("%d",&m); while(m--) { scanf("%d",&n); data=(int *)malloc(sizeof(int)*(n+1)); for(i=0;i<n;i++) scanf("%d",&data[i]); lcm(n); free(data); } } void lcm(int n) //求n个数的最小公倍数 { int gcd ( int a,int b ); int i,j; int tem; int now=data[0]; for(i=1;i<n;i++) { tem=gcd(now,data[i]); now=now/tem*data[i]; } printf("%d\n",now); } int gcd ( int a,int b ) //求两个数的最大公约数 { int temp; if (a<b) { temp=a; a=b; b=temp; } if ( a % b == 0) return b; else return gcd ( b,a % b) ; }
天下武功,唯快不破
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步