两个数字的LCM

时间:2011-03-03 04:45:43

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

我的LCM计划结果出错了。

ifirst找到数字的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;
}

任何帮助都非常感激。

6 个答案:

答案 0 :(得分:5)

您的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

答案 1 :(得分:4)

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

gcd已被定义为函数。您无法定义具有相同名称的变量。

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

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

答案 2 :(得分:0)

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

此外,您确定x * y产品将始终适合int吗?也可以使用long long作为一个好主意。

答案 3 :(得分: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;
}

答案 4 :(得分: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);
    }

答案 5 :(得分:0)

1. While 循环

代码:

#include <stdio.h>
int main() {
  int x, y, res;
  printf("Enter two positive integers: ");
  scanf("%d %d", &x, &y);
  res = (x > y) ? x : y;
  while (1) {
      if (res % x == 0 && res % y == 0) {
          printf("The LCM obtained from %d and %d is %d.", x, y, res);
          break;
      }
      ++res;
  }
  return 0;
}

输出:

Enter two positive integers: 7
35
The LCM obtained from 7 and 35 is 35.

2.功能

代码:

#include <stdio.h> 
int findLCM(int x, int y, int res);
int main()
{
 int x, y, res;
 printf (" \n Enter two positive integers: ");
 scanf ("%d %d", &x, &y);
 res = (x > y) ? x : y;
 int lcm=findLCM(x,y,res);
 printf ( " \n The LCM obtained from %d and %d is %d. ", x, y, res);
 return 0;
}
int findLCM ( int x, int y, int res)
{ 
  while (1) {
     if (res % x == 0 && res % y == 0) {
         return res;
         break;
     }
     else{++res;}
    
 }
}

输出:

Enter two positive integers: 7
35
The LCM obtained from 7 and 35 is 35.

参考:Scaler 主题