【问题标题】:LCM of two numbers两个数字的 LCM
【发布时间】:2011-03-03 04:45:43
【问题描述】:

我的 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;
}

非常感谢任何帮助。

【问题讨论】:

  • 如果您已经测试过 gcd,您会发现它总是返回 0,而且原因很明显。一旦 gcd 正常工作,then 将是检查 lcm 是否正常工作的时候了。这指向了软件开发和调试的一般策略。此外,这段代码甚至无法编译的事实令人怀疑:您是如何从中得到错误结果的?
  • 感谢吉姆的提示。该代码现在对我来说很好。
  • @user642371 以后,请发布您编译的实际代码。对 cme​​ts 的回复应包含 @name,以便您回复的人收到警报。谢谢。

标签: c algorithm overflow greatest-common-divisor lcm


【解决方案1】:

您的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 变为零时x 将是gcd,因此您需要返回x 而不是y

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

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

但如果 lcm 不能放入 int 你将不得不使它成为 long long

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 谢谢。问题 1 是一个错字。问题 2 已解决。
    • 如果x * y 可以溢出,那么lcm 的结果也可以; lcm 函数类型的大小是决定因素。这应该写成itype lcm(int x, int y) { return (itype)x / gcd(x, y) * y; },其中itype 是一个足够大的整数类型,可以容纳任何预期的结果。
    【解决方案3】:

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

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

    【讨论】:

    • @user642371:它认为你已经明白为什么你必须返回 x 而不是 y。关于溢出,假设 x 和 y 都是 2,000,000,000。这非常适合int,他们的 LCM 也是 2,000,000,000,这也没有问题。但在中间步骤中,您计算​​x*y 并将其存储在int 中。现在,x*y 是 2,000,000,000*2,000,000,000,即 4*10^18。这对于int 来说太大了,会导致溢出。你会在prod 中得到一个错误的值,然后将它除以 gcd 将再次给你一个毫无意义的值,因为原始值由于溢出而被列出。
    • @user642371 请注意,仅将产品放入 long long 是不够的;您需要将 lcm 函数的类型设置为 long long 以处理所有情况。例如,lcm(2000000000, 2000000001) 是 4000000002000000000,它太大而无法放入 int。
    【解决方案4】:
    #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;
    }
    

    【讨论】:

      【解决方案5】:

      这个 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);
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多