![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
Shashlyk |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 38 Пол: Мужской Репутация: ![]() ![]() ![]() |
Помогите Пожалуйста доделать задание:
Назовем среднестатистическим такой элемент массива, для которого модуль разности его значения и среднего арифметического значения элементов массива минимален. Аналогично, назовем уникальным элемент для которого модуль этой разности максимален. Найдите в массиве среднестатистический и уникальный элементы и их индексы. Мой код: 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 |
![]()
Сообщение
#2
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата В случае, если в массиве окажется два или более среднестатистических (или уникальных) элемента, Они не могут быть разными по значению, только одинаковыми. Если они будут разными - то один из элементов не будет среднестатистическим, или уникальным. Потому что модуль его разности со средним арифметическим не будет минимальным или максимальным соответственно. Так что тебе достаточно проходить по массиву в порядке возрастания индексов и запоминать только индекс первого элемента с минимальной/максимальной разностью:выведите меньший из них 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 |
![]()
Сообщение
#3
|
Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 168 Пол: Мужской Реальное имя: Сергей Андрианов Репутация: ![]() ![]() ![]() |
Отчего же?
Пример: 1,2,3,4 Среднее арифметическое 2.5. Среднестатистические: 2 и 3. Уникальные 1 и 4. |
Shashlyk |
![]()
Сообщение
#4
|
Новичок ![]() Группа: Пользователи Сообщений: 38 Пол: Мужской Репутация: ![]() ![]() ![]() |
Они не могут быть разными по значению, только одинаковыми. Если они будут разными - то один из элементов не будет среднестатистическим, или уникальным. Потому что модуль его разности со средним арифметическим не будет минимальным или максимальным соответственно. Так что тебе достаточно проходить по массиву в порядке возрастания индексов и запоминать только индекс первого элемента с минимальной/максимальной разностью: 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 |
![]()
Сообщение
#5
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата У меня почему-то выводит неправильные результаты Это не ко мне вопрос. Мой код выдает вот такие результаты (даже без исправления, внесенного мной позже, все равно для этих данных выводится правильный результат) :Цитата Averaged : a[0] = 4 на твоих данных. Вопрос, ЧЕМ они неправильные - остается открытым. КАКИЕ - правильные по твоему? Среднее арифметическое = 3.857142857142857, с учетом этого минимальный модуль разности:Unique : a[2] = 8 0.1428571428571428 (для нулевого элемента), а максимальный = 4.142857142857142 - для элементов с индексами 2 и 6. Значения одинаковые, значит, берем минимальный индекс, то есть, 2. Что не так? А то, что ты перекроил код по-своему - вот и ищи ошибку у себя. |
Shashlyk |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 38 Пол: Мужской Репутация: ![]() ![]() ![]() |
Это не ко мне вопрос. Мой код выдает вот такие результаты (даже без исправления, внесенного мной позже, все равно для этих данных выводится правильный результат) : на твоих данных. Вопрос, ЧЕМ они неправильные - остается открытым. КАКИЕ - правильные по твоему? Среднее арифметическое = 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
Помогите Пожалуйста исправить |
IUnknown |
![]()
Сообщение
#7
|
![]() a.k.a. volvo877 ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 013 Пол: Мужской Репутация: ![]() ![]() ![]() |
У меня почему-то выводит неправильные результаты.. помогите Пожалуйста! Потому что ты работаешь со средним арифметические как с ЦЕЛЫМ числом, а надо - как с вещественным. Или сразу описывай 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;
}
}
// Дальше пошел вывод
|
![]() ![]() |
![]() |
Текстовая версия | 18.07.2025 10:58 |