2014-10-23 21 views
0

나는이 범위 1-100에 숫자를 "추측"할 20 개 시도가이 기능 :이 반올림 문제를 우아하게 해결하는 방법은 무엇입니까?

int guess(int number) { 
    int start = 1; 
    int end = 100; 
    int count = 20; 
    int answer = 0; 

    while (count--) { 
     int half = start + round((double)(end - start)/2); 
     if (number < half) end = half; 
     else if (number > half) start = half; 
     else { 
      answer = half; 
      break; 
     } 
    } 

    if (answer > 0) return 20 - count; 
    else return 0;  
} 

문제는 지금 범위 반감의 결과를 반올림 한, 그것은 추측 할 수 있다는 것입니다 숫자 1, 그리고 만약 내가 둥글지 않으면 범위의 다른 극단을 추측 할 수 없다. -

문제의 근원은 명백한 원유 해킹 솔루션이지만, 나는 찾을 수없는 것 같다. 그것을 해결하는 우아한 방법.

답변

2

(100)을 포함, 그이 쉽게 수정할 수 :

는 , 그것은 그것을 확인 후 가능성의 범위에서 중간 점을 보관하지 마십시오 아니다

가능한!

왜 이런 문제가 있습니까? 왜냐하면 합리적인 범위 내에서 반 개방 범위 대신 닫힌 범위로 작업하기 때문입니다. 이와 같은 따로 사용 정수 산술로

:

int half = (start + end)/2; 

(0쪽으로 정수 분할 발사)

+0

이미 설명한대로 100에 대해 작동하지 않습니다. –

+0

@ user3735658 : 시도해보십시오. 그런 중간 범위를 떠나지 않는 것을 기억하십시오. 어쨌든, 실제 오류와 그 근본 원인을 분명히하기 위해 다시 말하십시오. – Deduplicator

+0

더 좋아합니다. –

0

값이있는쪽에 따라 천장과 바닥을 사용하십시오.

그래서 상단면에서 값을 찾고 바닥면 (5.9 -> 5)을 사용하고 절반 이하의 값을 찾고 있다면 천장 (90.2 = 91)을 사용하십시오.

이이 과정을 확인해야

1과 당신은 알고

+0

나는 유지 노력은'점검 때까지 두 번 half' 다음 끝을 할당하고 작동 바닥이나 천장을 만들다에 시작하지만 모든 값에 대한 시도의 수를 증가시킨다, 그래서 정말 자격을하지 않습니다 매우 우아한 IMO. –

+0

실제로 많은 오버 헤드가 발생합니다. 예를 들어 51은 1 회 시도, 26 회는 2 회 등으로 추측되지만이 접근법을 사용하면 동일한 숫자에 대해 8 회 시도합니다. 범위 내의 모든 숫자에 대한 총 시도 횟수는 573에서 700까지 증가합니다. –

0

이 작동하지만, 어떤 경우에는 하나 개 이상의 루프를 취할 수있다. 101로 끝을 초기화하면 정수 나누기 반올림으로 인한 문제가 제거됩니다 (시작은 0으로 설정할 수도 있지만 필요하지는 않습니다). 루프를 수행하기 전에 코드에서 1 또는 100을 확인할 수도 있지만 두 개 이상의 루프가 포함되는지는 확실하지 않습니다.

int j; 
int start; 
int end; 
int half; 
    for(j = 1; j < 101; j++){ 
     start = 1; 
     end = 101; 
     while(1){ 
      half = (start + end)/2; 
      if(half == j) 
       break; 
      if(half < j) 
       start = half; 
      else 
       end = half; 
     } 
     printf("%3d\n", half); 
    } 
관련 문제