求n个数的最小公倍数。 Input 输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。 Output 为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整数。 Sample Input 2 4 6 3 2 5 7 Sample Output 12 70
#include<stdio.h> #include<string.h> int gcd(int a, int b) { int c; if(b == 0) return a; while(b) { c = a; a = b; b = c % b; } return a; } int main() { int n, i, max = -1, maxsign, j, f; int a[500]; while(scanf("%d", &n) != EOF) { for(i = 0; i < n; i++) scanf("%d", &a[i]); if(n == 1) { printf("%d\n", a[0]); continue; } f = a[0]; for(i = 1;i < n; i++)//不要写成“<=”n个数只要求n-1次最小公倍数。 f = (f/gcd(f, a[i]))*a[i]; printf("%d\n", f); } return 0; }最大公约数:greatest common divisor 最小公倍数:lowest common multiple 公式::x*y = gcd lcm 即:lcm = xy/gcd gcd求法:辗转相除法。 另外再附上求最小公倍数的的两个博主的链接: 链接1
链接2
下面是我用枚举思想写的AC代码: 思想是:找到输入的数中的最大数。对该最大数进行倍数扩大,最大数倍数扩大的同时对该列数中除最大数以外的所有数取余,如果能对这些数都取余为0,即此时最大数的倍数即为该组数的最小公倍数。 但是, 学长说:给你两个数一个100000007(一亿零7),一个100000009(一亿零9)。两个极大的质数。 最大的是100000009,那么得对100000009扩增100000007次才能找到这两个数的最小公倍数。 这样很容易 Time Limit Exceeded 的。 他还建议我打ACM尽量用long long 来定义。大多数情况是用很大数据来测试的。
#include<stdio.h> #include<string.h> #include <algorithm> int main() { int n, i, max = -1, maxsign, j; int a[500]; while(scanf("%d", &n) != EOF) { max = -1;//max每次又没初始化。 for(i = 0; i < n; i++) { scanf("%d", &a[i]); if(a[i] > max) { max = a[i]; maxsign = i; } } if(n == 1) { printf("%d\n", a[0]); continue; } for(j = 1; ; j++)//学长说这是暴力枚举,如果数据很大会超时。 { for(i = 0; i < n; i++) { if( ((max*j) % a[i]) != 0) break; if(i == maxsign) continue; } if(i == n) { printf("%d\n", max*j); break; } } } return 0; }