0

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

我首先找到数字的 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;
}

非常感谢任何帮助。

4

5 回答 5

6

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

return y;

return x;

了解欧几里得算法:

RULE 1: gcd(x,0) = x
RULE 2: gcd(x,y) = gcd(y,x % y)

考虑x = 12y = 18

  gcd (12, 18)
  = gcd (18, 12)  Using rule 2
  = gcd (12,6)    Using rule 2
  = gcd (6, 0)    Using rule 1
  = 6

正如你所看到的,什么时候y变为零xgcd所以你需要返回x而不是y

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

lcm = x * (y / gcd(x,y))

但如果lcm不能适应int你就必须成功long long

于 2011-03-03T04:49:02.180 回答
4

问题 1) int gcd = gcd(x,y);

gcd已经定义为一个函数。您不能定义具有相同名称的变量。

问题 2) 更改return yreturn xingcd()否则每次都会返回 0。

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

于 2011-03-03T04:51:00.577 回答
0

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

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

于 2011-03-03T04:52:04.130 回答
0

这个 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);
    }
于 2018-08-12T11:52:48.897 回答
0
#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;
}
于 2017-05-23T18:48:03.017 回答