参考代码(1):
#include<stdio.h>
int lcm(int x,int y)
{
int r = x , nx = x,ny = y;
while(y != 0)
{
r = y;
y = x%y;
x = r;
}
return nx/x*ny;
}
int main()
{
int m, n, i, re, T;
scanf("%d", &T);
while(T--)
{
scanf("%d", &m);
scanf("%d", &re);
for(i = 1; i < m; i++)
{
scanf("%d",&n);
re = lcm(re,n);
}
printf("%d\n", re);
}
return 0;
}
参考代码(2):
#include<stdio.h>
int lcm(int x,int y){
int r = x , nx = x,ny = y;
while(y != 0)
{
r = y;
y = x%y;
x = r;
}
return nx*ny/x;
}
int main()
{
int m, n, i, re, T;
scanf("%d", &T);
while(T--)
{
scanf("%d", &m);
scanf("%d", &re);
for(i = 1; i < m; i++)
{
scanf("%d",&n);
re = lcm(re,n);
}
printf("%d\n", re);
}
return 0;
}
特别提醒:
参考代码(2)与参考代码(1)有什么不同?我们发现,仅仅是计算最小公倍数的过程中,计算次序的不同。在数学中,两者完全相同,但是在这个题目中,参考代码(2)却是错误的。题目中已经给出所有输入数据以及结果,都在32位整数范围以内,使用int来计算。但是显然,a*b/d 这个数字在int以内,并不意味着a*b也在int以内。错误的原因就是中间结果溢出。