2015-01-09 3 views
2

주어진 숫자 k, a, b, c. if 또는 배열이나 루프를 사용하지 않고 a, b, c 중 k 번째로 큰 번호를 찾는 방법. 최소 또는 최대 기능이 제공됩니다.세 개의 숫자 중 n 번째로 큰 숫자 찾기

+3

왜 if 또는 배열이나 루프를 사용할 수 없습니까? 컨텍스트가 도움이 될 것입니다. –

+0

이것은 아마도 인터뷰 (또는 숙제)의 퍼즐 일 가능성이 높습니다. – Jarlax

답변

3

C++ 조각과 같은 것이 필요합니다. 다른 언어로 보일 수도 있습니다.

auto 1st = max(a,max(b,c)); 
auto 3rd = min(a,min(b,c)); 
auto 2nd = a+b+c-1st-3rd; 
return (2-k)*(3-k)*1st/2 + (k-1)*(3-k)*2nd + (k-1)*(k-2)*3rd/2; 

그것은 3.

이 더 아름다운 2 개 코멘트 결과를 통합, k는 숫자 1, 2 다음 중 하나에 해당한다고 가정한다 : 또한

#define maybe(x) x*(x!=n1&&x!=n3) 
auto n1 = max(a,max(b,c)); 
auto n3 = min(a,min(b,c)); 
auto n2 = maybe(a)+maybe(b)+maybe(c); 
return n1*(k==1) + n2*(k==2) + n3*(k==3); 

을, 내 첫번째 버전은 무시 식별자가 숫자로 시작할 수 없다는 사실.

일부 언어에서는 (k == 1) 정수로 사용할 수 없거나 0 또는 1이 될 수 없습니다. 이러한 언어에서 첫 번째 버전이 더 잘 작동 할 수 있습니다.

오버플로 관련 : 이는 유형에 따라 다릅니다.

정수 유형의 경우 a + b + c-n1-n3이 오버플로를 유발할 수 있지만 여전히 정확합니다. 그 이유는 다음과 같습니다. a + b + c-n1-n3의 결과는 더 낮은 비트에서 정확합니다. 예를 들어 32 비트 숫자를 사용하면 a, b 및 c는 32 비트 숫자가되고 결과는 가장 낮은 32 비트에서 정확합니다. 즉, 결과는 정확히 a 또는 be 또는 c가됩니다. 따라서 그것은 정확합니다. float 숫자에 대해 ^가 작동하지 않으며 질문에서 숫자의 유형을 지정하지 않았다는 사실을 감안할 때 ^에서 + 및 -로 돌아갑니다.

정수가 아닌 형식의 경우 오버플로로 인해 반올림 오류가 발생할 수 있습니다. 이를 방지하기 위해 이제 0을 추가 할 때를 제외하고는 + 또는 -를 사용하지 않는 구현을 선택했습니다.

+2

좋은 해결책이지만, 예를 들어'a + b + c '가 오버 플로우 할 수 있다는 점을 명심하십시오. –

+0

'a^b^c^1st^3rd'는 오버플로를 피하지만,'return' 줄에도 오버플로 문제가 있습니다. return 문 뒤에 아이디어를 간략히 설명해 주시겠습니까? "(! (k-1)) * 1st + (! (k-2)) * 2nd + (! (k-3)) * 3rd' –

+0

아니면 이것을 어떻게 얻습니까? – tobeka

관련 문제