我创建了一个代码来查找两个No的LCM。我认为该代码是正确的,但我的输出不理想。这段代码有什么问题?
#include<stdio.h>
#include<conio.h>
main()
{
int i, j, a, b, lcm;
printf("Enter two nos : ");
scanf("%d %d", &a, &b);
for(i=1; i<=b; i++)
{
for(j=1; j<=a; j++)
{
if(a*i==b*j)
{
lcm=a*i;
break;
}
}
}
printf("LCM=%d", lcm);
getch();
}
答案 0 :(得分:0)
两个数字a,b的LCM至少为max(a,b),最大为a * b,因此您对边界的第一个想法是正确的。但是,如果仔细研究LCM(两个正整数)a和b的定义之一,您会发现LCM是最小的数字,因此LCM%a = 0和LCM%b = 0,其中“% ”的意思是“整数除法的余数,会被截断”,这正是您可以在这里使用的。
示例:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int a, b, lcm;
printf("Enter two nos : ");
scanf("%d %d", &a, &b);
/* TODO: checks and balances! */
/* Set lcm to the larger of the two numbers */
lcm = (a < b) ? b : a;
/* check if both "a" and "b" divide "lcm" without a remainder
* otherwise increment "lcm" */
for (;;) {
if ((lcm % a == 0) && (lcm % b == 0)) {
/* we got the LCM, break out of loop */
break;
}
/* Otherwise increment "lcm" by one */
lcm++;
}
printf("LCM = %d\n", lcm);
exit(EXIT_SUCCESS);
}
有更优雅,更通用的方法,但是我认为上面的示例很容易理解。