输入正整数n,m,编写程序计算n和m的最小公倍数。
解题思路:
使用辗转相除法,求得最大公约数,再将乘积除以它即得结果
注意可能出现的越界情况,a,b本身是int,但是乘积就不一定是了。这时候用到long型,但是在算的时候我也犯了小错,这里int*int需要强制转换成long型才适用于得到结果。
最好的处理方法就是最开始就把它们都设置为long型,这样便不会出错
#include<stdio.h>
int zzxc(int a,int b)
{
int c,n;
if(a<b)
{
c=a;
a=b;
b=c;
}
if(b==0)
{
return a;
}
n=a%b;
return zzxc(b,n);
}
int main()
{
int a,b,c,i;
long long sum=1;
scanf("%d %d",&a,&b);
sum=zzxc(a,b);
sum=(long long int)a*(long long int)b/sum;
printf("%lld",sum);
return 0;
}
穷举是能运行且答案对的,但是会出现超时。穷举,我想到的优化是找到两个数最小的,然后从最小的一半开始向下穷举。
#include<stdio.h>
int main()
{
int a,b,c,i;
int sum=1;
scanf("%d %d",&a,&b);
if(a>b)
c=b;
else
c=a;
c=c/2;
for(i=c;i>1;i++)
{
if(a%i==0&&b%i==0)
{
sum=sum*i;
}
}
sum=a*b/sum;
printf("%d",sum);
return 0;
}