Как найти элемент наиболее близкий к среднему

m0nte-cr1st0 , спасибо. А к чему это

странно, для малых чцифр работает правильно, а для больших – не всегда:
[4, 4, 1, 8, 7] 4.8
4
>>>
== RESTART: C:UsersivanAppDataLocalProgramsPythonPython 37-3216.3.py ==
[6, 4, 2, 7, 4] 4.6
4
>>>
== RESTART: C:UsersivanAppDataLocalProgramsPythonPython 37-3216.3.py ==
[2, 1, 9, 9, 9] 6.0
9
>>>
== RESTART: C:UsersivanAppDataLocalProgramsPythonPython 37-3216.3.py ==
[8, 3, 9, 6, 8] 6.8
6
>>>
== RESTART: C:UsersivanAppDataLocalProgramsPythonPython 37-3216.3.py ==
[5, 1, 2, 8, 4] 4.0
4
>>>
== RESTART: C:UsersivanAppDataLocalProgramsPythonPython 37-3216.3.py ==
[8, 9, 8, 5, 7] 7.4
7
>>>
== RESTART: C:UsersivanAppDataLocalProgramsPythonPython 37-3216.3.py ==
[5, 4, 9, 7, 8] 6.6
7
>>>
== RESTART: C:UsersivanAppDataLocalProgramsPythonPython 37-3216.3.py ==
[5, 9, 3, 4, 1, 3] 4.166666666666667
4
>>>
== RESTART: C:UsersivanAppDataLocalProgramsPythonPython 37-3216.3.py ==
[4, 2, 1, 3, 6] 3.2
3



0



Как найти значение и индексы элемента массива, наиболее близкого к среднему арифметическому всех его элементов? (Язык Си)



Ученик

(90),
закрыт



2 года назад

Николай Веселуха

Высший разум

(334024)


2 года назад

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#define BUFFER 10
int main(void) {
double box[BUFFER];
int i;
double sm = 0.;
double avg;
double value;
double x;
double dx;
int index;
srand((unsigned)time(NULL));
for (i = 0; i < BUFFER; ++i) box[i] = (rand() % 201 – 100) + (double)(rand() % 10) / 10;
for (i = 0; i < BUFFER; ++i) printf(“%8.1lf”, box[i]);
puts(“”);
for (i = 0; i < BUFFER; ++i) sm += box[i];
avg = sm / BUFFER;
dx = fabs(box[0] – avg);
x = dx;
value = box[0];
index = 0;
for (i = 1; i < BUFFER; ++i) {
dx = fabs(box[i] – avg);
if (dx < x) {
x = dx;
value = box[i];
index = i;
}
}
printf(“Average: %.3lfnValue: %.1lfnIndex: %in”, avg, value, index);
system(“pause > nul”);
return 0;
}

Юрий Копнин

Мыслитель

(8039)


2 года назад

Сперва находим среднее арифметическое, складываем все элементы массива и делим на количество элементов в массиве. Далее снова идем по всем элементам и считаем разность между каждым элементом и средним арифметическим. Наиболее близким будет тот элемент, разность с которым окажется наименьшая, т. е. ближе к нулю.

#include <stdio.h>
#include <math.h>

int main()
{
    int N, i, c, j, sum = 0, array[10000] = { 0 };
    int result;

    scanf("%d", &N);


    for (i = 0; i < N; i++)

        scanf("%d", &array[i]);


    for (i = 0; i < N; i++)
    {
        sum = sum + array[i];
    }
    sum = sum / N;

    c = sum - array[0];
    result = array[0];

    for (j = 1; j < N; j++)
    {
        if ((sum - array[i]) < c)
        {
            c = sum - array[i];
            result = array[i];
        }
    }

    printf("%d", result);

    return 0;
}

нужно задать длину массива, ввести числа и вывести одно наиболее приближенное к среднему значению число (целочисленное), код выше выводит просто первое число которое я ввел(т.е. назначает его наиболее приближенным к среднему значению), а мне нужно чтобы он проверил все числа и вывел наиболее приближенное к среднему значению число.Если не трудно напишите мне исправленный или подскажите что неправильно и как исправить если не трудно))язык си

пример правильно работающего кода:
длина массива=5;
вводим числа
9,
7,
5,
-3,
-1.
среднее знач=5

This is my array a= [5, 25, 50, 100, 250, 500] .
The mean value of a is 155 (i calculated using sum(a)/len(a)) but i have to store 100 in a variable instead of 155.

Is there any easy way to solve this problem.

asked Sep 21, 2022 at 11:05

Deepan's user avatar

2

IIUC, use numpy.argmin to find the the index of the value closest to the mean by computing the absolute difference to the mean:

a = np.array([5, 25, 50, 100, 250, 500])

out = a[np.argmin(np.abs(a-a.mean()))]

output: 100

answered Sep 21, 2022 at 11:11

mozway's user avatar

mozwaymozway

176k12 gold badges33 silver badges72 bronze badges

If we want to go with pure python, I would write a function like this:

from typing import List
numb_list = [1, 4, 10, 20, 55, 102, 77, 89]


def find_closest_to_mean(num_list: List[int])->int:
    mean = sum(numb_list)/len(num_list)
    distance_list = [abs(mean - num) for num in numb_list]
    return num_list[distance_list.index(min(distance_list))]


print(find_closest_to_mean(numb_list))  

[Out]

mean = 44.75
closest number = 55

here I create a function called find_closest_to_mean that expects a num_list argument that is a list of integers. It then first calculates the mean of the list, creates a distance_list in which each element corresponds to the distance of the num_list in that position with the mean (as an absolute value). lastly it returns an integer from the num_list that has the least distance to the mean.

answered Sep 21, 2022 at 11:23

Hirad Gorgoroth's user avatar

Hirad GorgorothHirad Gorgoroth

3892 gold badges3 silver badges13 bronze badges

0

If you want to keep it pure python, you can use a custom key for sorted to find the lowest difference element:

a= [5, 25, 50, 100, 250, 500]
a_mean = sum(a)/len(a)
out = sorted(a, key=lambda val:abs(val-a_mean))[0]
# 100

answered Sep 21, 2022 at 11:16

Lukas Schmid's user avatar

Lukas SchmidLukas Schmid

1,8751 gold badge6 silver badges18 bronze badges

1

Расписывать не стану,но обьясню,что происходит и почему это так происходит.
У вас i глобальная переменная,существующая вне циклов, соответственно, после окончания цикла ,она будет хранить значение, равное длинне цикла,в вашем случае 5.
В этом куске


razn1 = mas[0]-sr_arif; // Из первого элемента массива вычитаем среднее ариф-ое, получаем разницу1.
razn2 = mas[i]-sr_arif; // Из каждого элемента массива вычитаем среднее ариф-ое, получаем разницу2.

Вы находите две разности, первая, это разность между первым элементом и средним.Вторая, это разность между пятым элементом и средним.И вы из сравниваете.Ваши тесты построены так,что первая разница меньше второй.Вы в j записываете ноль, переприсваиваете,и что же вы сравниваете.

razn1 = razn2; } // разницу1 приравниваем к разнице2. 

Во-первых,наоборот, вы разницу 2 присваиваете разнице 1.А во вторых,ваша разница 2 никак не меняется,поэтому у вас выходит, что и в разнице 1 и в разнице 2 храниться одно и тоже число.Проверку условия оно конешно же не проходит, в результате остальные 9 циклов вообще ничего не делают и в качестве результата у вас всегда 0.
Могу дать подсказку.


razn1 = mas[0]-sr_arif; // Из первого элемента массива вычитаем среднее ариф-ое, получаем разницу1.
j=0 ; // Обнуляем переменную.
for (i = 1 ; i<5 ; i++)
{
razn2 = mas[i]-sr_arif; // Из каждого элемента массива вычитаем среднее ариф-ое, получаем разницу2.
if( fabs(razn1) > fabs(razn2)) // Если модуль разницы1 больше модуля разницы2, то...
{ j=i; // элемент массива вводим в новую переменную и...
razn1 = razn2; } // разницу1 приравниваем к разнице2.
}

Вот так оно уже будет менять разницу 2,но все равно ответ будет не всегда верным.

Сообщение отредактировано: Krjuger – 27.05.2012 21:03

Добавить комментарий