2013-12-16 4 views
0

누구나 Java에서 재귀을 사용하지 않고 이진 나누기 을 수행하는 가장 직접적이고 + 최적의 방법을 제안 할 수 있습니까?더 쉬운 + 바이너리 나누기를하는 최적의 방법

나는 잘 작동하지만 다음과 같은 코드가 있지만이 기본 수학 함수가 훨씬 더 쉽게 여기에 있어야한다고 생각합니다.

private static int div(int dividend, int divisor) { 
    int denom = divisor; 
    int count = 1; 
    while (denom <= dividend) { 
     denom <<= 1; 
     count <<= 1; 
    } 
    if (denom > dividend) { 
     denom >>= 1; count >>= 1; 
    } 

    int answer = 0; 
    // Now find the smaller dividend 
    while (count != 0) { 
     if (dividend >= denom) { 
      dividend = dividend - denom; 
      // Consume the count value; 
      answer = answer + count; 
     } 
     count >>>= 1; 
     denom >>= 1; 
    } 

    return answer; 
} 
+0

이것은 재귀 함수가 아니며 반복적 인 함수입니다. 정확히 무슨 문제입니까? – piokuc

+0

이 코드는 작동합니다. 왜 그것이 더 쉬워 져야한다고 생각합니까? 더 쉬운 것이 무엇을 의미합니까? – Geobits

+0

코드 줄이 적어 질 수 있습니다. "쉽게 입력 할 수 있습니다." – MxyL

답변

3

간단한 대답은 구현하기가 어려운 종류의 알고리즘입니다.

위에서 설명한 알고리즘은 반복마다 1 비트를 생성하며 (분배기가 갈수록) 매우 간단합니다.

반복 당 1 비트 (예 : CORDIC 및 바이너리 복원)를 생성하는 다른 알고리즘이 있습니다. 그들 중 누구도 하나 또는 두 개의 라이너가 아니지만, 좀 더 간단하고 이해하기 쉬운 찾을 수 있습니다.

반복마다 더 많은 비트를 생성 할 수있는 다른 구분 알고리즘이 있습니다. 예를 들어, SRT radix-4 분배기는 반복 당 4 비트를 생성 할 수 있습니다. 비용은 알고리즘이 심지어 인 것보다 많습니다. 복합체입니다. 만약 당신이 알고리즘에 어려움을 겪고 있다면, 즉각적인 추측은 당신이 끔찍하고 완전히 절망적 인 곳에서 이들을 찾을 수 있다는 것입니다.

2

직감이 정확합니다. 이 경우에는 한 줄짜리가 있습니다.

private static int div(int dividend, int divisor) { 
    return dividend/divisor; 
} 
+0

나누기 연산자를 사용하지 않으려 고합니다.하지만 말장난을 위해 +1을드립니다! – Hemant

관련 문제