2013-08-30 5 views
8

"두 정수의 가장 큰 공약수는 두 숫자의 공약수를 균등하게 나눌 수있는 가장 큰 정수입니다. 두 정수의 가장 큰 공약수를 반환하는 Gcd 메서드를 작성하십시오. 사용자로부터 두 개의 값을 읽고 결과를 표시합니다. "C# 가장 큰 공약수 찾기

당신이 날은이 문제를 해결하는 데 도움이 될 수 있습니다 (이 책 내가 사용하고 단지 연습, 숙제를하지 않습니다)? 여기에 내가 지금까지 가지고있는 것이있다. 감사합니다

(편집 - 나를 위해 GCD를 나는 두 숫자를 제출할 수 있지만 계산되지 않습니다)

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

코드가 작동하지 않습니까? 아니면 불완전합니까? –

+1

여기에 무슨 문제가 있습니까? –

+0

두 개의 숫자를 제출할 수는 있지만 나를 위해 Gcd를 계산하지 않습니다 – user2723261

답변

3

당신은 this 사용하여 시도 할 수 있습니다 : - LINQ를 사용

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

을 :

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

는 LINQ를 사용하지 :

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

참고 : 대답은 Greatest Common Divisor from a set of more than 2 integers의 대답에서 빌린 것입니다.

+8

올바르지 않습니다. 이 답을 LINQ와 LINQ가 아닌 두 가지 방법으로 나눌 수는 없습니다. 첫 번째 메서드는 Aggregate 호출에서 두 번째 메서드를 호출하는 것입니다. 이름이 같기 때문에 약간 혼란 스럽습니다. – Metro101

+3

Karl에게 회신하는 것이 좋을 것입니다. 귀하의 대답은 실제로 부정확합니다. –

3

이 시도 :

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

    int r = p % q; 

    return GCD(q, r); 
} 
13

여기에 어떤 힙 할당을 수행하지 않고 최대 공약수를 반환 Euclidean algorithm의 구현입니다.

uint으로 대체 할 수 있습니다. 서명 된 값에 대해서는이 기법이 작동하지 않으므로 부호없는 유형이 사용됩니다. ab 값이 음수가 아니라면 long 또는 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; 
} 

이 방법이 unit tests 관련 지을 수 있고 내 metadata-extractor 라이브러리에 사용된다.

+2

이것은 페이지에서 가장 좋은 답변입니다. 비싸고 관계없는 재귀 호출을 수행하지 않으며 실제로 OP의 특정 질문에 응답합니다 (어떤 이유로 GCD에 대한 몇 가지 다른 답변과 달리). –

+0

그들은 세트의 GCD를 계산합니다. 왜냐하면 그들은 별도의 질문에 대한 대답으로 이해할 수없는 코드를 복사하여 붙여 넣기 때문입니다. –

+1

깔끔하고 깨끗한 - LINQ- 수프가 섞여 있지 않습니다. 그리고 그걸로 정확히 내 자신의 작은 "딜레마"를 찾고 있었던 것입니다. : 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); 
     } 

    } 
관련 문제