2013-08-30 16 views
8

"Il massimo comun divisore di due interi è il più grande intero che divide uniformemente ciascuno dei due numeri. Metodo di scrittura Gcd che restituisce il massimo comun divisore di due numeri interi. legge due valori dall'utente e visualizza il risultato. "C# trova il massimo comun divisore

(questo non è compiti a casa, solo un esercizio nel libro che sto usando)

si può aiutarmi a risolvere questo? Ecco cosa ho ottenuto finora. Grazie

(Edit - posso presentare i due numeri ma non sarà calcolare il GCD per me)

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

    } 
} 
+0

Il tuo codice non funziona o è solo incompleto? –

+1

Qual è il problema qui? –

+0

Posso inviare i due numeri ma non calcolerà il Gcd per me – user2723261

risposta

3

Puoi provare a utilizzare 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); 
} 
12

Utilizzando LINQ:

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

Non utilizzando LINQ:

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

Nota: la risposta sopra è stata presa in prestito dalla risposta accettata allo Greatest Common Divisor from a set of more than 2 integers.

+8

Questo non è corretto. Non puoi dividere questa risposta in LINQ e non LINQ, la soluzione sono i due metodi che funzionano insieme. Il primo metodo chiama il secondo metodo nella chiamata Aggregate, questo è un po 'confuso perché i nomi sono gli stessi. – Metro101

+3

sarebbe molto bello rispondere a questo, Karl. La tua risposta è davvero sbagliata. –

3

Prova questo:

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

    int r = p % q; 

    return GCD(q, r); 
} 
13

Ecco un'implementazione della Euclidean algorithm che restituisce il massimo comun divisore senza eseguire alcuna allocazione heap.

Se necessario, è possibile sostituire ulong per uint. Viene utilizzato un tipo senza segno, in quanto la tecnica non funziona per i valori con segno. Se sai che i tuoi valori a e b non sono negativi, puoi utilizzare invece long o int.

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

Questo metodo viene utilizzato nella mia biblioteca metadata-extractor, dove è associato unit tests.

+2

Questa è la migliore risposta sulla pagina; non fa alcuna chiamata ricorsiva costosa ed estranea, e in effetti risponde alla domanda specifica dell'OP (a differenza di poche altre risposte che per qualche ragione divergono su GCD di un set). –

+0

Calcolano il GCD di un set perché copiano e incollano il codice che non capiscono da una risposta a una domanda separata. –

+1

Bello e pulito - non si mescolava la zuppa LINQ. E con quello, esattamente quello che stavo cercando per il mio piccolo "dilemma". : D – Scre

0
int a=789456; 


    int b=97845645; 
    if(a>b)  
    { 

    } 
    else 
    { 
     int temp=0; 
     temp=a; 
     a=b; 
     b=temp; 
    } 
    int x=1; 
    int y=0 ; 

    for (int i =1 ; i < (b/2)+1 ; i++) 
    { 

     if(a%i==0) 
     { 
      x=i; 
     } 
     if(b%i==0) 
     { 
      y=i; 
     } 
     if ((x==y)& x==i & y==i & i < a) 
     { 
      Console.WriteLine(i); 
     } 

    } 
Problemi correlati