如何找到C中最接近的平均值元素?

时间:2020-11-02 20:44:57

标签: arrays c

,如何找到此数组中最接近的平均值? Idk如何执行此操作。

SQL> with test (a, b, c) as
  2    (select 20, 20, 23 from dual union all
  3     select 20, 20, 20 from dual union all
  4     select 20, 21, 22 from dual union all
  5     select 13, 14, 30 from dual
  6    )
  7  select a, b, c,
  8         case when a = b then 'Isosceles'
  9         else 'not isosceles'
 10         end result
 11  from test;

         A          B          C RESULT
---------- ---------- ---------- -------------
        20         20         23 Isosceles
        20         20         20 Isosceles
        20         21         22 not isosceles
        13         14         30 not isosceles

SQL>

谢谢,伙计们! :D

2 个答案:

答案 0 :(得分:0)

找到平均值后,重复寻找最接近的值。

// Pseudo code
average=arraysum(A, sum, i, n)/n;
best = element 0
for (each element in the array [1...n-1])
  if (|A[i] - average| < |A[best] - average|) 
    best = i

为了应付平均值而不是整数,并且不使用不必要的浮点数学运算...

long long scaled_average = arraysum(A, sum, i, n);
best = element 0
for (each element in the array [1...n-1])
  if (|n*A[i] - scaled_average| < |n*A[best] - scaled_average|) 
    best = i

请考虑对long long使用sum以避免溢出。


简化代码:无需传递sum

long long arraysum(int A[], int i, int n) {
    long long sum = 0;
    for(i=0; i<n; i++)
        sum+=A[i];
    return sum; 
}

答案 1 :(得分:0)

第一个建议是将A[100];的声明从此处移出

int n, A[100], i, b, sum;   

要在scanf()语句之后创建一个VLA

    int n, i, b, sum;
    ...
    printf("Enter number of elements in array: ");
    scanf("%d", &n);
    int A[n];
    for(i=0; i<n; i++)
         scanf("%d", &A[i]);

...根据需要创建大小合适的数组。

填充数组后,循环遍历该数组,并使用比较运算符查找最接近数组值平均值之差的值。 (伪代码:fabs(a[i]-ave) < fabs(a[i+1]-ave))跟踪最接近的数组值的数组索引。

示例:

average = arraysum(A, sum, i, n)/(n*(1.0));//divide by floating point

 int closestIndex;
 findClosest(int A, 100, average, &closestIndex);
 printf("Index of value closest to %f is %d\nClosest value is: %d\n",  
            average, closestIndex, A[closestIndex]);

定义findClosest()的地方:

void findClosest(int A[], size_t size, double ave int *index)
{
     int smallestIndex;
     for(int i=0;i<size-1;i++)
     {
          smallestIndex = fabs((double)A[i]-ave) < fabs((double)A[i+1]-ave) ? i : i + 1;
     }
     *index = smallestIndex 
}