嗨,如何找到此数组中最接近的平均值? 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
答案 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
}