Форум «Всё о Паскале» _ Ада и другие языки _ [Java] Среднестатистический и уникальный элементы
Автор: Shashlyk 7.06.2011 11:12
Помогите Пожалуйста доделать задание: Назовем среднестатистическим такой элемент массива, для которого модуль разности его значения и среднего арифметического значения элементов массива минимален. Аналогично, назовем уникальным элемент для которого модуль этой разности максимален. Найдите в массиве среднестатистический и уникальный элементы и их индексы. Мой код:
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;} }
Помогите Пожалуйста учесть вот это условие: В случае, если в массиве окажется два или более среднестатистических (или уникальных) элемента, выведите меньший из них, а в случае равенства элементов между собой - укажите наименьший индекс.
Автор: IUnknown 7.06.2011 17: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]);
Автор: andriano 8.06.2011 1:11
Отчего же? Пример: 1,2,3,4 Среднее арифметическое 2.5. Среднестатистические: 2 и 3. Уникальные 1 и 4.
Автор: Shashlyk 8.06.2011 22:07
Цитата(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
У меня почему-то выводит неправильные результаты.. помогите Пожалуйста!
Автор: IUnknown 8.06.2011 22:24
Цитата
У меня почему-то выводит неправильные результаты
Это не ко мне вопрос. Мой код выдает вот такие результаты (даже без исправления, внесенного мной позже, все равно для этих данных выводится правильный результат) :
Цитата
Averaged : a[0] = 4 Unique : a[2] = 8
на твоих данных. Вопрос, ЧЕМ они неправильные - остается открытым. КАКИЕ - правильные по твоему? Среднее арифметическое = 3.857142857142857, с учетом этого минимальный модуль разности: 0.1428571428571428 (для нулевого элемента), а максимальный = 4.142857142857142 - для элементов с индексами 2 и 6. Значения одинаковые, значит, берем минимальный индекс, то есть, 2. Что не так?
А то, что ты перекроил код по-своему - вот и ищи ошибку у себя.
Автор: Shashlyk 8.06.2011 22:52
Цитата(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; } }