给你两个数,求最小公倍数。 每行输入两个数a,b。(0< a < 1000000, 0< b < 1000000 )。 每行输出最小公

给你两个数,求最小公倍数。

每行输入两个数a,b。(0< a < 1000000, 0< b < 1000000 )。

每行输出最小公倍数。(a,b的最小公倍数 < 2^31)

#include<stdio.h>
int main()
{
long int a,b,c,t,m,n;
long double k;
while(scanf("%d%d",&m,&n)!=EOF)
{
a=m;
b=n;
if(b>a)
{
t=a;
a=b;
b=t;
}
while((c=a%b)!=0)
{
a=b;
b=c;
}
k=m*n/b;
printf("%.0lf\n",k);
}
return 0;
}

通不过···高手求解 (最小公倍数 < 2^31) 小数据可以 大数据不行了

如果你的编译器支持 __int64 这个数据类型(-2^63~2^63),那么直接把所有int 换成__int64就行。
其实你已经考虑到 数据范围问题,虽然double 足够大,但是精度有限,所以一种常规做法就是用加法代替乘法:例如求(5,3)那么 先判断5 % 3 ==0? 然后(5+5)% 3 ==0? 然后(10+5)%3==0,结果就是15,只要测试数据规范,就能过。
如果超时,再联系我,还有跟好的算法
#include<stdio.h>
int main()
{
long int a,b,c,t,m,n;
long double k;
while(scanf("%d%d",&m,&n)!=EOF)
{
a=m;
b=n;
if(b>a)
{
t=a;
a=b;
b=t;
}

while (a % b)
{
a += m;
}
printf("%d",a);
/* while((c=a%b)!=0)
{
a=b;
b=c;
}
k=m*n/b;
printf("%.0lf\n",k);*/
}
return 0;
}追问

你写的程序有问题
5 3 可以3 5会死循环的
通过了 谢谢

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-03-23
k不用定议为long double 可以定义为long long int;
打印K的时候用%llu
k = m*n/b,这一行加一个强制转换,不然位数不够:k = (long long int)m*n/b;
可以了追问

long long int
vc++6.0 'long' followed by 'long' is illegal

第2个回答  2018-12-08
#include<iostream>
using namespace std;
int main()
{
unsigned long long int a,b,c,d,x,s;
cin>>a>>b;
d=a>b?a:b;
x=a<b?a:b;
c=1;
while((c*d)%x)
c++;
cout<<c*d<<endl;
getchar();
return 0;
}
/*这大概是最快的算法了吧,望采纳*/
相似回答