web-dev-qa-db-fra.com

C # trouver le plus grand diviseur commun

"Le plus grand diviseur commun de deux entiers est le plus grand entier qui divise également chacun des deux nombres. Écrivez la méthode Gcd qui renvoie le plus grand diviseur commun de deux entiers. Incorporez la méthode dans une application qui lit deux valeurs à l'utilisateur et affiche le résultat."

(ce n'est pas des devoirs, juste un exercice dans le livre que j'utilise)

pouvez-vous m'aider à résoudre ce problème? Voici ce que j'ai jusqu'à présent.

(modifier - je peux soumettre les deux nombres mais cela ne calculera pas le Gcd pour moi)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Greatest_Common_Divisor
{
class Program
{

    static int GetNum(string text)
    {
        bool IsItANumber = false;
        int x = 0;
        Console.WriteLine(text);

        do
        {
            IsItANumber = int.TryParse(Console.ReadLine(), out x);

        } while (!IsItANumber);

        return x;
    }
    static void Main(string[] args)
    {
        string text = "enter a number";
        int x = GetNum(text);
        text = "enter a second number";
        int y = GetNum(text);


        int z = GCD(x, y);
        Console.WriteLine(z);
    }

    private static int GCD(int x, int y)
    {
        int v = 0;
        int n = 0;

        v = GetGreatestDivisor(x, y);


        return v;

    }

    static int GetGreatestDivisor(int m, int h)
        {

            do
            {
                for (int i = m; i <= 1; i--)



                    if (m%i == 0 && h%i == 0)
                    {
                        int x = 0;
                        x = i;

                        return x;
                    }
            } while (true);
            return m;
        }

  }
}
19
user2723261

Voici une implémentation de algorithme euclidien qui retourne le plus grand diviseur commun sans effectuer d'allocation de tas.

Vous pouvez remplacer ulong par uint si nécessaire. Un type non signé est utilisé, car la technique ne fonctionne pas pour les valeurs signées. Si vous savez que vos valeurs a et b ne sont pas négatives, vous pouvez utiliser long ou int à la place.

private static ulong GCD(ulong a, ulong b)
{
    while (a != 0 && b != 0)
    {
        if (a > b)
            a %= b;
        else
            b %= a;
    }

    return a == 0 ? b : a;
}

Cette méthode est utilisée dans ma bibliothèque métadonnées-extracteur , où elle a associé tests unitaires .

35
Drew Noakes

En utilisant la méthode d'agrégation de LINQ:

static int GCD(int[] numbers)
{
    return numbers.Aggregate(GCD);
}

static int GCD(int a, int b)
{
    return b == 0 ? a : GCD(b, a % b);
}

Remarque: la réponse ci-dessus est empruntée à la réponse acceptée à le plus grand diviseur commun d'un ensemble de plus de 2 nombres entiers .

15
Karl Anderson

Vous pouvez essayer d'utiliser this : -

static int GreatestCommonDivisor(int[] numbers)
{
    return numbers.Aggregate(GCD);
}

static int GreatestCommonDivisor(int x, int y)
{
return y == 0 ? x : GCD(y, x % y);
}
5
Rahul Tripathi

Essaye ça:

public static int GCD(int p, int q)
{
    if(q == 0)
    {
         return p;
    }

    int r = p % q;

    return GCD(q, r);
}
3
user2623931
By using this, you can pass multiple values as well in the form of array:-


// pass all the values in array and call findGCD function
    int findGCD(int arr[], int n) 
    { 
        int gcd = arr[0]; 
        for (int i = 1; i < n; i++) {
            gcd = getGcd(arr[i], gcd); 
}

        return gcd; 
    } 

// check for gcd
int getGcd(int x, int y) 
    { 
        if (x == 0) 
            return y; 
        return gcd(y % x, x); 
    } 
2
Chang