Tristan M.
Tristan M.

Reputation: 377

Least Common Multiple

I have the current coding which used to be a goto but I was told to not use goto anymore as it is frowned upon. I am having troubles changing it into for say a while loop. I am fairly new to C# and programming in general so some of this is completely new stuff to me. Any help would be appreciated. The actual question is input two numbers and find the lowest common multiple.

Here is the original with goto:

BOB:
    if (b < d)
    {                
        a++;
        myInt = myInt * a;
        b = myInt;
        myInt = myInt / a;

        if (b % myInt2 == 0)
        {
            Console.Write("{0} ", h);
            Console.ReadLine();
        }

    }
    if (d < b)
    {
        c++;
        myInt2 = myInt2 * c;
        d = myInt2;
        myInt2 = myInt2 / c;

        if (d % myInt == 0)
        {
            Console.Write("{0} ", t);
            Console.ReadLine();
        }
        else
        {
            goto BOB;
        }

    }
    else
    {
        goto BOB;
    }

   }

Upvotes: 27

Views: 39223

Answers (8)

AffluentOwl
AffluentOwl

Reputation: 3647

Here's a more efficient and concise implementation of the Least Common Multiple calculation which takes advantage of its relationship with the Greatest Common Factor (aka Greatest Common Divisor). This Greatest Common Factor function uses Euclid's Algorithm which is more efficient than the solutions offered by user1211929 or Tilak.

C#, C++, C:

static int gcf(int a, int b)
{
    while (b != 0)
    {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

static int lcm(int a, int b)
{
    return (a / gcf(a, b)) * b;
}

For more information see the Wikipedia articles on computing LCM and GCF.

Upvotes: 56

Adrian Franczak
Adrian Franczak

Reputation: 93

Hey if anyone need something more modern :)

public static class MathHelpers
{
    public static T GreatestCommonDivisor<T>(T a, T b) where T : INumber<T>
    {
        while (b != T.Zero)
        {
            var temp = b;
            b = a % b;
            a = temp;
        }

        return a;
    }

    public static T LeastCommonMultiple<T>(T a, T b) where T : INumber<T>
        => a / GreatestCommonDivisor(a, b) * b;
    
    public static T LeastCommonMultiple<T>(this IEnumerable<T> values) where T : INumber<T>
        => values.Aggregate(LeastCommonMultiple);
}

Upvotes: 8

user1211929
user1211929

Reputation: 1190

Try This:

using System;

public class FindLCM
{
    public static int determineLCM(int a, int b)
    {
        int num1, num2;
        if (a > b)
        {
            num1 = a; num2 = b;
        }
        else
        {
            num1 = b; num2 = a;
        }

        for (int i = 1; i < num2; i++)
        {
            int mult = num1 * i;
            if (mult % num2 == 0)
            {
                return mult;
            }
        }
        return num1 * num2;
    }

    public static void Main(String[] args)
    {
        int n1, n2;

        Console.WriteLine("Enter 2 numbers to find LCM");

        n1 = int.Parse(Console.ReadLine());
        n2 = int.Parse(Console.ReadLine());

        int result = determineLCM(n1, n2);

        Console.WriteLine("LCM of {0} and {1} is {2}",n1,n2,result);
        Console.Read();
    }
}

Output:

Enter 2 numbers to find LCM
8
12
LCM of 8 and 12 is 24

Upvotes: 13

Ahsan
Ahsan

Reputation: 11

int n1 = 13;
int n2 = 26;

for (int i = 2; i <= n1; i++)
 {
    if (n1 % i == 0 && n2 % i == 0)
    {
    Console.WriteLine("{0} is the LCM of {1} and 
    {2}",i,n1,n2);
    break;
 }

  }

Upvotes: 0

Amit Kumar Verma
Amit Kumar Verma

Reputation: 3

Here is much optimized solution for finding LCM.

 private static int lcmOfNumbers(int num1, int num2)
    {
        int temp = num1 > num2 ? num1 : num2;
        int counter = 1;
        while (!((temp* counter++) % num1 == 0 && (temp* counter++) % num2 == 0)) {
        }
        return temp* (counter-2);
    }

Upvotes: 0

Arthur
Arthur

Reputation: 1

        int num1, num2, mull = 1;

        num1 = int.Parse(Console.ReadLine());  
        num2 = int.Parse(Console.ReadLine());

        for (int i = 1; i <= num1; i++)
        {
            for (int j = 1; j <= num2; j++)
            {
                if (num1 * j == num2 * i)
                {
                    mull = num2 * i;
                    Console.Write(mull); 
                    return;
                }
            }
        }

Upvotes: 0

Vlada
Vlada

Reputation: 61

Here is one recursive solution. It might be on some interview question. I hope it helps

    public static int GetLowestDenominator(int a, int b, int c = 2)
    { 
        if (a == 1 | b == 1) {
            return 1;
        }
        else if (a % c == 0 & b % c == 0)
        {
            return c;
        }
        else if (c < a & c < b)
        {
            c += 1;
            return GetLowestDenominator(a, b, c);
        }
        else
        {
            return 0;
        }
    }

Upvotes: 0

Tilak
Tilak

Reputation: 30698

Try this

 int number1 = 20;
 int number2 = 30;
 for (tempNum = 1; ; tempNum++)
 {
   if (tempNum % number1 == 0 && tempNum % number2 == 0)
   {
       Console.WriteLine("L.C.M is - ");
       Console.WriteLine(tempNum.ToString());
       Console.Read();
       break;
    }
 }

// output -> L.C.M is - 60

Upvotes: 1

Related Questions