Один из способов решить эту проблему - смоделировать его как некий конечный автомат с двумя состояниями. В исходном состоянии вы еще не видели ненулевых значений, и поэтому ответ таков: «нет числа, отвечающего этому критерию». В этом состоянии каждый раз, когда вы видите ноль, вы остаетесь в этом состоянии. Для ненулевого значения запишите это значение и перейдите в следующее состояние. Это следующее состояние означает: «Я видел хотя бы одно ненулевое значение, и теперь мне нужно отслеживать наименьшее значение, которое я видел». Получив здесь, всякий раз, когда вы получаете ненулевое значение в качестве входных данных для алгоритма, вы сравниваете его величину с величиной значения с наименьшим ненулевым значением, которое вы видели, а затем сохраняете меньшее из двух.
Простая реализация этого на C-подобном языке может выглядеть так:
bool seenNonzeroValue = false;
double minValue; /* No initializer necessary; we haven't seen anything. */
while (MoreDataExists()) {
double val = GetNextElement();
/* If the value is zero, we ignore it. */
if (val == 0.0) continue;
/* If the value is nonzero, then the logic depends on our state. */
*
* If we have not seen any values yet, then record this value as the first
* value we've seen.
*/
if (!seenNonzeroValue) {
seenNonzeroValue = true;
minValue = val;
}
/* Otherwise, keep the number with the smaller magnitude. */
else {
if (fabs(val) < fabs(minValue))
minValue = val;
}
}
/* If we saw at least one value, report it. Otherwise report an error. */
if (seenNonzeroValue)
return minValue;
else
ReportError("No nonzero value found!");
Надеюсь, это поможет!