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
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
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 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 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