Нахождение минимального и максимального номера массива
Когда я запускаю эту программу, она находит максимальное число, но всегда печатает 0.0 как минимум.
Когда я использую Double.POSITIVE_INFINITY и Double.NEGATIVE_INFINITY вместо установки наименьшего и наибольшего значения x[0], это работает правильно.
Использование Math.min и Math.max также дает мне ту же ошибку, но работает также с Double.POSITIVE_INFINITY и Double.NEGATIVE_INFINITY. Я просмотрел несколько других подобных вопросов, и мне не разрешается использовать Array.sort или любые другие предложения, которые публикуют люди.
Я просто хочу знать, почему установка обеих переменных на x [0] только когда-либо работает, чтобы найти наибольшее число, независимо от того, объявляю ли я эту переменную первой, второй или устанавливаю ее равной (Двойное наибольшее, наименьшее = x[0]).
public class MaxAndMin {
public static void main (String[] args) {
Scanner s= new Scanner(System.in);
System.out.println("How many numbers would you like to enter?");
int n= s.nextInt();
double[] x= new double[n];
double smallest= x[0]; //double smallest= Double.POSITIVE_INFINITY;
double largest= x[0]; //double largest= Double.NEGATIVE_INFINITY;
for (int i=0; i<x.length; i++) {
x[i]= kbd.nextDouble();
if (x[i] > largest) {
largest = x[i];
} else if (x[i] < smallest) {
smallest = x[i];
}
}
System.out.println("Smallest number: " + smallest + " Largest number: " + largest);
}
}
1 ответ
Когда вы инициализируете smallest
а также largest
Вы не поместили никаких значений в x
поэтому его элементы - это просто значения по умолчанию, с которыми был создан массив, то есть ноль.
Следовательно, вы найдете только меньший smallest
значение, если один меньше нуля (или больше largest
значение, если один больше нуля).
Вы должны использовать POSITIVE_INFINITY
а также NEGATIVE_INFINITY
инициализировать значения, так как все значения меньше и больше, чем они соответственно.
Кроме того, вы можете инициализировать smallest = largest = x[0]
в цикле, когда i == 0
, Тем не менее, первый подход предпочтительнее, так как он не требует проверки i == 0
на каждой итерации.
В качестве альтернативы, вы можете переместить первое назначение из цикла:
x[0] = smallest = largest = kbd.nextDouble();
for (int i = 1; i<x.length; i++) {
x[i] = kbd.nextDouble();
...
Это позволяет избежать проверки i == 0
неоднократно, но вы должны продублировать kbd.nextDouble()
, Я бы все еще использовал первый подход.