求n个数的最小公倍数,帮忙找错

as010wxw 2011-01-24 07:50:14


#include<stdio.h>
int function(int n,int m)
{
int s;
if(n<m)
{
s=n;
n=m;
m=s;
}
s=1;
while(m!=0)
{
s=n%m;
n=m;
m=s;
}
return n;
}
int main()
{
int s,i,x,y,n;
while(scanf("%d",&x)!=EOF)
{
s=1;
for(i=0;i<x;i++)
{
scanf("%d",&y);
n=function(s,y);


s=s*y;

}
printf("%d\n",s/n);



}




return 0;
}



Description

求n个数的最小公倍数。

Input

输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。




Output

为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整数。




Sample Input


2 4 6
3 2 5 7





Sample Output


12
70



Source

ZJGSU


本地测试成功,提交时提示为:Wrong Answer ,应该是有的测试数据没有包含进来,帮忙给些提示
...全文
392 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
FancyMouse 2011-01-25
  • 打赏
  • 举报
回复
啊看错。lz算的是x*y*z*w/gcd(x*y*z,w),所以答案还是不对。比如抓个
4
6 3 2 1
就挂了。
FancyMouse 2011-01-25
  • 打赏
  • 举报
回复
lcm(x,y)=x*y/gcd(x,y)
但是lcm(x,y,z)不等于x*y*z/gcd(x,y,z)
所以比起溢出来,lz的代码还有更subtle的problem。
sea_spray 2011-01-24
  • 打赏
  • 举报
回复
就是楼主
s=s*y;
改为s=s*y/n;试试如何~~~~
flysnowhite 2011-01-24
  • 打赏
  • 举报
回复
LZ应该就是这句话出了问题:
s=s*y;
改为s=s*y/n;就可以了。

这样求的是两个数的最小公倍数。

在数论里,假设用[a,b]表示最小公倍数,(a,b)表示最大公约数,则[a,b,c]=[[a,b],c],以此类推。
而[a,b]=a*b/(a,b).
masmaster 2011-01-24
  • 打赏
  • 举报
回复
N个数的LCD不会, 我只会两个的 ~_~

1 #include <stdio.h>
2 int gcd (int u,int v) {
3 int temp;
4 if(u<0||v<0) {
5 u = -1;
6 return u;
7 }
8 while (v!=0) {
9 temp = u%v;
10 u=v;
11 v=temp;
12 }
13 return u;
14 }
15 int lcm (int u,int v) {
16 int result;
17 result=(u*v)/gcd(u,v);
18 return result;
19 }
20 int main (void) {
21 int u,v;
22 int gcd (int u,int v);
23 int lcm (int u,int v);
24
25 printf ("Enter two digit:\n");
26 scanf ("%i %i",&u,&v);
27
28 printf ("%i and %i's Least Common Digit is:%i\n",u,v,lcm(u,v));
29 return 0;
30 }


CInviteJavaToDance 2011-01-24
  • 打赏
  • 举报
回复
试试这段行吗?

#include<stdio.h>
int function(int n,int m)
{
int s;
if(n<m)
{
s=n;
n=m;
m=s;
}
s=1;
while(m!=0)
{
s=n%m;
n=m;
m=s;
}
return n;
}
int main()
{
int s,i,x,y,n;
while(scanf("%d",&x)!=EOF)
{
s=1;
for(i=0;i<x;i++)
{
scanf("%d",&y);
n=function(s,y);


s=s/n*y;

}
printf("%d\n",s);



}

return 0;
}
baihacker 2011-01-24
  • 打赏
  • 举报
回复
s=s*y;

}
printf("%d\n",s/n);

这里s=s*y会导致s溢出,虽然最终结果s/n不会溢出。

可以用x[i]表示前i个数的最小公倍数。
那么设第i+1个数为d[i+1]则设t = gcd(x[i], d[i+1]), x[i+1] = x[i]/t*d[i+1];
注意先除以t再乘以d[i+1]。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧