IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> [Java] Среднестатистический и уникальный элементы
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской

Репутация: -  0  +


Помогите Пожалуйста доделать задание:
Назовем среднестатистическим такой элемент массива, для которого модуль разности его
значения и среднего арифметического значения элементов массива минимален.
Аналогично, назовем уникальным элемент для которого модуль этой разности
максимален. Найдите в массиве среднестатистический и уникальный элементы и их
индексы.
Мой код:
 int sum = 0;
int index1 = 0;
int index2 = 0;
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
double srAr = 0;
for (int i = 0; i < n; i++){
sum =+a[i];
}
srAr = sum / n;
for (int i = 0; i < n; i++){
if (Math.abs(a[i] - srAr) < Math.abs(a[index2] - srAr)) {index2 = i;}
if (Math.abs(a[i] - srAr) > Math.abs(a[index1] - srAr)) {index1 = i;}
}

Помогите Пожалуйста учесть вот это условие:
В случае, если в массиве окажется два или более среднестатистических (или уникальных) элемента,
выведите меньший из них, а в случае равенства элементов между собой - укажите наименьший индекс.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
В случае, если в массиве окажется два или более среднестатистических (или уникальных) элемента,
выведите меньший из них
Они не могут быть разными по значению, только одинаковыми. Если они будут разными - то один из элементов не будет среднестатистическим, или уникальным. Потому что модуль его разности со средним арифметическим не будет минимальным или максимальным соответственно. Так что тебе достаточно проходить по массиву в порядке возрастания индексов и запоминать только индекс первого элемента с минимальной/максимальной разностью:

             int indexMin = 0; 
int indexMax = 0;
double min = Double.MAX_VALUE;
double max = Double.MIN_VALUE;
double srAr = 0.0, currMin, currMax;

for (int i = 0; i < n; i++) {
sum += a[i];
}
srAr = sum / n;
System.out.println("Average = " + srAr);
for (int i = 0; i < n; i++) {
if((currMin = Math.abs(a[i] - srAr)) < min) {
indexMin = i; min = currMin;
}
if((currMax = Math.abs(a[i] - srAr)) > max) {
indexMax = i; max = currMax;
}
}
System.out.println("Averaged : a[" + indexMin + "] = " + a[indexMin]);
System.out.println("Unique : a[" + indexMax + "] = " + a[indexMax]);

 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гуру
*****

Группа: Пользователи
Сообщений: 1 168
Пол: Мужской
Реальное имя: Сергей Андрианов

Репутация: -  28  +


Отчего же?
Пример: 1,2,3,4
Среднее арифметическое 2.5.
Среднестатистические: 2 и 3.
Уникальные 1 и 4.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской

Репутация: -  0  +


Цитата(IUnknown @ 7.06.2011 14:22) *

Они не могут быть разными по значению, только одинаковыми. Если они будут разными - то один из элементов не будет среднестатистическим, или уникальным. Потому что модуль его разности со средним арифметическим не будет минимальным или максимальным соответственно. Так что тебе достаточно проходить по массиву в порядке возрастания индексов и запоминать только индекс первого элемента с минимальной/максимальной разностью:

             int indexMin = 0; 
int indexMax = 0;
double min = Double.MAX_VALUE;
double max = Double.MIN_VALUE;
double srAr = 0.0, currMin, currMax;

for (int i = 0; i < n; i++) {
sum += a[i];
}
srAr = sum / n;
System.out.println("Average = " + srAr);
for (int i = 0; i < n; i++) {
if((currMin = Math.abs(a[i] - srAr)) < min) {
indexMin = i; min = currMin;
}
if((currMax = Math.abs(a[i] - srAr)) > max) {
indexMax = i; max = currMax;
}
}
System.out.println("Averaged : a[" + indexMin + "] = " + a[indexMin]);
System.out.println("Unique : a[" + indexMax + "] = " + a[indexMax]);




Пример входного файла
7
4 2 8 1 3 1 8

Пример выходного файла
1 4
3 8

У меня почему-то выводит неправильные результаты.. помогите Пожалуйста!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата
У меня почему-то выводит неправильные результаты
Это не ко мне вопрос. Мой код выдает вот такие результаты (даже без исправления, внесенного мной позже, все равно для этих данных выводится правильный результат) :
Цитата
Averaged : a[0] = 4
Unique : a[2] = 8
на твоих данных. Вопрос, ЧЕМ они неправильные - остается открытым. КАКИЕ - правильные по твоему? Среднее арифметическое = 3.857142857142857, с учетом этого минимальный модуль разности:
0.1428571428571428 (для нулевого элемента), а максимальный = 4.142857142857142 - для элементов с индексами 2 и 6. Значения одинаковые, значит, берем минимальный индекс, то есть, 2. Что не так?

А то, что ты перекроил код по-своему - вот и ищи ошибку у себя.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 38
Пол: Мужской

Репутация: -  0  +


Цитата(IUnknown @ 8.06.2011 19:24) *

Это не ко мне вопрос. Мой код выдает вот такие результаты (даже без исправления, внесенного мной позже, все равно для этих данных выводится правильный результат) :
на твоих данных. Вопрос, ЧЕМ они неправильные - остается открытым. КАКИЕ - правильные по твоему? Среднее арифметическое = 3.857142857142857, с учетом этого минимальный модуль разности:
0.1428571428571428 (для нулевого элемента), а максимальный = 4.142857142857142 - для элементов с индексами 2 и 6. Значения одинаковые, значит, берем минимальный индекс, то есть, 2. Что не так?

А то, что ты перекроил код по-своему - вот и ищи ошибку у себя.


void Zadacha () throws FileNotFoundException{ 

int sum=0;
int indexMin = 0;
int indexMax = 0;
double min = Double.MAX_VALUE;
double max = Double.MIN_VALUE;
double srAr = 0.0, currMin, currMax;

for (int i = 0; i < n; i++) {
sum += a[i];
}
srAr = sum / n;
for (int i = 0; i < n; i++) {
if((currMin = Math.abs(a[i] - srAr)) < min) {
indexMin = i; min = currMin;
}
if((currMax = Math.abs(a[i] - srAr)) > max) {
indexMax = i; max = currMax;
}
}


PrintWriter fout = new PrintWriter("output.txt");
fout.print(indexMin +" ");
fout.println(a[indexMin]);
fout.print(indexMax +" ");
fout.print(a[indexMax]);
fout.flush();
fout.close();
}
}


Выводит:
4 3
2 8

Помогите Пожалуйста исправить
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Гуру
*****

Группа: Пользователи
Сообщений: 1 013
Пол: Мужской
Ада: Разработчик
Embarcadero Delphi: Сторонник
Free Pascal: Разработчик

Репутация: -  627  +


Цитата(Shashlyk @ 8.06.2011 18:07) *
У меня почему-то выводит неправильные результаты.. помогите Пожалуйста!
Потому что ты работаешь со средним арифметические как с ЦЕЛЫМ числом, а надо - как с вещественным. Или сразу описывай sum вещественным:
double sum=0.0;

, и дальше - по тексту, или
srAr = (double)sum / n;

... Это тебе не Паскаль, где результат деления - всегда вещественное число. Здесь если делишь целое на целое - то и в результате получаешь целое...

А вообще, в код надо добавить еще кое-что, чтобы оно работало совсем по условию (см. пост andriano):
             double sum = 0;
int indexMin = 0;
int indexMax = 0;
double min = Double.MAX_VALUE;
double max = Double.MIN_VALUE;
double srAr = 0.0, currMin, currMax;

for (int i = 0; i < n; i++) {
sum += a[i];
}
srAr = sum / n;
System.out.println("Average = " + srAr);
for (int i = 0; i < n; i++) {
if((currMin = Math.abs(a[i] - srAr)) < min) {
indexMin = i; min = currMin;
}
else
if (currMin > min) ; // Чтобы не сравнивать вещественные между собой
else {
if(a[i] < a[indexMin]) indexMin = i;
}

if((currMax = Math.abs(a[i] - srAr)) > max) {
indexMax = i; max = currMax;
}
else
if (currMax < max) ;
else {
if(a[i] < a[indexMax]) indexMax = i;
}
}

// Дальше пошел вывод
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 29.03.2024 12:52
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name