2014-10-29 1 views
1

주어진 숫자의 평균에 가장 가까운 (그리고 마이너) 숫자를 찾아야합니다. 예를 들어 : 주어진 숫자가 1,2,3,4,5 경우배열, 부동 소수점을 사용하여 C++에 가장 가까운 수 찾기

평균 3 할 것이다, 그래서 결과가 있어야 가장 가까운 숫자는 2와 4하지만 마이너 2 2.

주어진 숫자는 1, 325, 350, 299의 평균이 243.75 될 것입니다 경우

또는, 그래서 가장 가까운 수는 299

int best = a[0]; 
for (i = 1; i < count; ++i) 
best = abs(a[i] - x) < abs(best - x) ? a[i] : best;  
+0

이 작업을 수행 할 때 배열이 항상 정렬되어 있습니까? –

+0

숫자가 항상 양수입니까? – didierc

+0

숙제입니까? –

답변

2

당신의 코드가 ... 방금도 거리가 있는지 확인하는 거의 바로해야 할 것입니다 평균 x에서 과 동일이 가장 좋은 거리이지만 보조 측에서는 best이 아닌 ...

double i_delta = abs(a[i] - x); 
double x_delta = abs(best - x); 
if (i_delta < x_delta) 
    best = a[i]; 
else if (i_delta == x_delta && a[i] < best) 
    best = a[i]; 

(평균을 계산하려면 값을 한 번 통과해야하므로 전반적인 알고리즘은 O (n)이됩니다. 그래서 당신이 사용하는 여분의 반복은 전반적인 big-O 효율을 감소시키지 않습니다. 모두 좋습니다.)

0

이것은 어렵지 않으며 그렇게 할 수 있어야합니다. 나는이 학교 숙제에서 질문 있으리라 믿고있어 당신은 기분이

int closest(int* array, int size){ 
//Calculating sum for finding average first 
    double sum = 0.0; 
    for (int i=0; i< size; i++){ 
     sum+= array[i]*1.0; 
    } 
//Here is our average 
    double average = sum/size; 
//Assuming initial answer is very huge so that every other comparison is less than this 
    int answer = 100000000; 
    for (int i=0; i< size; i++){ 
//Finiding the difference for current element 
     double temp = abs(array[i]-average); 
     double temp1 = abs(answer - average); 
//If current difference is less than previous one that replace the previous answer 
     if (temp < temp1) answer = array[i]; 
//If they are equal then accept the minor one 
     else if (temp == temp1){ 
      if (array[i]< answer) answer = array[i]; 
     } 
    } 

    return answer; 
} 

P.S. 없습니다 이 질문에 여기에 물어 보는 것은 좋은 습관이 아닙니다. 먼저 시도한 다음 시도를 통해 질문을 게시해야합니다.

+1

'int answer = 100000000;'임의의 큰 값을 쓰는 것은 바람직하지 않습니다. 상한이 필요하다면 대신 numeric_limits :: max()를 사용해야합니다. 게다가, 당신의 대답은 기본적으로 질문의 코드와 같습니다. –

+0

예제에서 보이는 값은 아주 작고 '대답'은 여전히 ​​INT_MAX의 한계입니다. – Dheerendra

+2

좋은 연습 문제입니다. INT_MAX의 값은 시스템에 따라 다릅니다. –

관련 문제