两个数的LCM

两个数的LCM,c,algorithm,overflow,greatest-common-divisor,lcm,C,Algorithm,Overflow,Greatest Common Divisor,Lcm,我的LCM程序得到了错误的结果 i首先找到数字的gcd,然后用gcd除以乘积 int gcd(int x, int y) { while(y != 0) { int save = y; y = x % y; x = save; } return y; } int lcm(int x, int y) { int prod = x * y; int Gcd = gcd(x,y); int lcm = prod / Gcd; return l

我的LCM程序得到了错误的结果

i首先找到数字的gcd,然后用gcd除以乘积

int gcd(int x, int y)
{
  while(y != 0)
  {
    int save = y;
    y = x % y;
    x = save;
  }
  return y;
}

int lcm(int x, int y)
{
  int prod = x * y;
  int Gcd = gcd(x,y);
  int lcm = prod / Gcd;

  return lcm;
}

非常感谢您的帮助。

您的
gcd
函数将始终返回
0
。改变

return y;

了解欧几里德算法:

RULE 1: gcd(x,0) = x
RULE 2: gcd(x,y) = gcd(y,x % y)
考虑
x=12
y=18

  gcd (12, 18)
  = gcd (18, 12)  Using rule 2
  = gcd (12,6)    Using rule 2
  = gcd (6, 0)    Using rule 1
  = 6
如您所见,当
y
变为零时
x
将是
gcd
,因此您需要返回
x
,而不是
y

此外,在计算lcm时,您将首先乘以数字,这可能会导致溢出。相反,您可以:

lcm = x * (y / gcd(x,y))
但是如果
lcm
无法放入
int
中,则必须使其
问题1)
int gcd=gcd(x,y)

gcd
已定义为一个函数。不能使用相同的名称定义变量

问题2)将
gcd()
中的
返回y
更改为
返回x
,否则每次都将返回0


问题3)
x*y
如果
x
y
较大,则可能会溢出。

您应该在gcd函数中返回x而不是y

另外,您确定产品x*y始终适合
int
?使用
long
也可能是一个好主意。

\include
#include <iostream>

using namespace std; 

long long gcd(long long int a, long long int b){
    if(b==0)
        return a;
    return gcd(b,a%b);
}

long long lcm(long long a,long long b){
    if(a>b)
        return (a/gcd(a,b))*b;
    else
        return (b/gcd(a,b))*a;
} 

int main(){
    long long int a ,b ;
    cin>>a>>b;
    cout<<lcm(a,b)<<endl;
    return 0;
}
使用名称空间std; 长-长gcd(长-长整型a,长-长整型b){ 如果(b==0) 返回a; 返回gcd(b,a%b); } 长-长lcm(长-长a,长-长b){ 如果(a>b) 申报表(a/gcd(a、b))*b; 其他的 报税表(b/gcd(a,b))*a; } int main(){ 长内点a,b; cin>>a>>b;
这个C程序是寻找LCM的不同方法

 #include<stdio.h>
    int main()
    {
        int a,b,lcm=1,i=2;
        printf("Enter two numbers to find LCM\n" );
        scanf("%d %d",&a ,&b);
        while(i <= a*b)
        {
            if(a%i==0 & b%i==0)
            {
                lcm=lcm*i;
                a=a/i;
                b=b/i;
                i=i-1;
            }
            if( a%i==0 & b%i!=0)
            {
                lcm=lcm*i;
                a=a/i;
                i=i-1;
            }
            if( b%i==0 & a%i!=0)
            {
                lcm=lcm*i;
                b=b/i;
                i=i-1;
            }
            i++;
        }
        printf("The LCM of numbers is %d\n", lcm);
    }
#包括
int main()
{
int a,b,lcm=1,i=2;
printf(“输入两个数字以查找LCM\n”);
scanf(“%d%d”、&a和&b);

while(谢谢你。问题1是一个输入错误。问题2解决了它。如果
x*y
可以溢出,那么
lcm
的结果也可以溢出;决定因素是
lcm
函数类型的大小。这应该写为
itype lcm(intx,inty){return(itype)x/gcd(x,y)*y;}
其中
itype
是一个足够大的整数类型,可以容纳任何预期结果。如果您测试过gcd,您会发现它总是返回0,其原因很明显。一旦gcd正常工作,那么就应该检查lcm是否正确。这表明了一个普遍的策略,即ftware开发和调试。此外,这段代码甚至没有编译的事实令人怀疑:您是如何从中得到错误结果的?谢谢Jim的提示。这段代码现在对我来说运行良好。@user642371将来,请发布您编译的实际代码。对注释的响应应该包含@name,以便您所遇到的人重新响应已发出警报。谢谢。@user642371:它认为您已经理解了为什么必须返回x而不是y。关于溢出,假设x和y都是2000000000。这非常适合于
int
,它们的LCM也是2000000000,这同样没有问题。但是在中间步骤中,您计算
x*y
,并将其存储在
int
。现在,
x*y
是2000000000*2000000000,即4*10^18。这对于
int
来说太大,将导致溢出。您将在
prod
中输入一个错误的值,并且将其除以gcd将再次给出一个无意义的值,因为原始值由于溢出而被列出。@user642371 N请注意,仅将产品放在long-long中是不够的;您需要将lcm函数的类型设置为long-long以处理所有情况。例如,lcm(20000000000,20000001)是4000000002000000,它太大,无法放入int中。
 #include<stdio.h>
    int main()
    {
        int a,b,lcm=1,i=2;
        printf("Enter two numbers to find LCM\n" );
        scanf("%d %d",&a ,&b);
        while(i <= a*b)
        {
            if(a%i==0 & b%i==0)
            {
                lcm=lcm*i;
                a=a/i;
                b=b/i;
                i=i-1;
            }
            if( a%i==0 & b%i!=0)
            {
                lcm=lcm*i;
                a=a/i;
                i=i-1;
            }
            if( b%i==0 & a%i!=0)
            {
                lcm=lcm*i;
                b=b/i;
                i=i-1;
            }
            i++;
        }
        printf("The LCM of numbers is %d\n", lcm);
    }