求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 ,应该是有的测试数据没有包含进来,帮忙给些提示
...全文
446 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]。
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

70,038

社区成员

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

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