1.总结
1.1。语言:C
我有一个像这样的数组{30,220,219,220,221},我有一个差值,让我们假设9(k = 9)。
我想获得所有小于该差异的整数元素。然后返回这些有效值的平均值。
注意1.数组的大小不是固定的。例如可能是这样的:
{220,219,220,30,216,224,217} //更大的数组大小
或{222,220,219,220,221} //所有值都在差异之内
或{30,66,89,220,221} //更多值超出范围
注2.不应删除重复的元素。否则,它可能会影响平均部分。
1.2。例:
给定数组:{30,219,220,221,216,220};
差异= 9;
我正在寻找以整数形式返回的219,220,221,216,220的平均值,即219。
我正在做的是首先找到合格元素的索引。然后删除索引重复项,然后取平均值。
2.背景
我在不同页面上找到的示例的帮助下编写了以下代码,但是存在一些问题。
3.代码
#include <stdio.h>
#include <math.h>
int countPairs(int a[], int n, int k)
{
printf( "n is %d \tand\t", n); //debug
printf( "k is %d\n\n", k); //debug
//////////////////////////////////////// finding indexes ////////////////
//credit: https://www.geeksforgeeks.org/pairs-difference-less-k/
int index[n*2];
int res = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if ((a[j] - a[i]) < k) {
index[res] = j;
printf("index[%d]= %d,\t", res, index[res]); //debug
printf("(%d,%d), (%d,%d)\n", i, j, a[i], a[j]); //debug
res++;
}
}
}
///////////////////////////////////////// removing duplicate indexes //////
// credit: https://www.studytonight.com/c/programs/array/remove-duplicate-element-program
int i, j, t, m=n*2;
for (i = 0; i < m; i++)
{
for (j = i + 1; j < m; )
{
if (index[j] == index[i])
{
for (t = j; t < m; t++)
{
index[t] = index[t + 1];
}
m--;
}
else
{
j++;
}
}
}
//////////////////////////////////////////////averaging ///////////
int arr[6],avg=0;
for (int i = 0; i <4; i++ ) {
arr[i]=a[index[i]];
avg+=arr[i];
printf( "a[%d] : %d\n", i, arr[i]); //debug
}
avg/=4;
printf( "Average : %d\n", avg); //debug
////////////////////////////////////////////////////////////////
return avg;
}
int main()
{
int a[] = {30, 219, 220, 221, 216, 220};
int k = 9;
int n = sizeof(a) / sizeof(a[0]);
/////////////////////////////////
printf("\nGiven array: {");
for (int i = 0; i <n; i++ ) {
printf("%d", a[i]);
if(i<n-1){
printf(", ");
}
}
printf("}\n\n");
/////////////////////////////////
countPairs(a, n, k);
///////////////////////////////
return 0;
}
4.实际结果,包括任何错误消息
此代码有两个问题:
缺少第一个有效索引。在我的代码中,输出缺少给定数组的索引1(即元素219)。如何解决?当前,它基于变量J。
我无法使代码在数组大小或循环号方面通用且灵活。
例如,如果您查看:
:: in中的第50和57行4表示(int i = 0; i
第47行-6在:: arr [6]中
第24行变量m- in :: :: m = n * 2; //此值不合逻辑,我只是基于一个简单的猜测就得出了
:: index [n * 2]中的第9行数组大小; //此数组的大小不合逻辑,我只是基于一个简单的猜测就得出了
我的代码的副本,带有行号,可以在以下位置找到:
https://repl.it/repls/SuburbanRelevantDisassembly
希望有您的帮助/建议。还是相比于此,您是否建议更好的解决方案?
提前致谢
最佳答案
我不知道我是否完全理解了这个问题,并且在看到代码可以正常工作的时候,但是我进行了更改,看来一切正常。
int countPairs(int a[], int n, int k)
{
printf( "n is %d \tand\t", n);
printf( "k is %d\n\n", k);
int index[n*2];
int res = 0;
for (int i=0; i<n; i++){
for(int j=i+1; j<n; j++){
if((a[j] - a[i]) < k){
index[res] = a[i];
res++;
}
}
}
int aux = 0;
for(int i=0; i<res; i++)
aux = aux + index[i];
printf("Average: %d", aux/res);
return aux/res;
}
关于c - 查找数组中具有给定差异的元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56194917/