Ich möchte den Fall ansprechen, wo es mehr als einen einzigen kleinsten Wert gibt.
In einem solchen Fall werden zwei Schleifen benötigt. Eine, um den kleinsten Wert über das gesamte Array herauszufinden, und die andere, um alle Elemente mit diesem Wert auf Null zu setzen.
Ich werde Spur des Minimums halten und maximalen Index, wo dieser Wert in dem Array erscheint den Bereich der zweiten Schleife zu minimieren:
void set_smallest_to_zero(double a[], size_t n) {
if (!a || !n) {
return;
}
double smallest = a[0];
size_t min_index = 0,
max_index = 0,
i;
// find the smallest values
for (i = 1; i < n; ++i) {
if (a[i] > smallest) {
continue;
} else if (a[i] < smallest) {
smallest = a[i];
min_index = i;
max_index = i;
} else { // a[i] == smallest
max_index = i;
}
}
// set to zero all the the minimum values
for (i = min_index; i <= max_index; ++i) {
if (a[i] == smallest) {
a[i] = 0.0;
}
}
}
HERE ist ein anschauliches Beispiel.
move 'a [i] = 0;' innerhalb der 'if'-Anweisung, und Vergleich aus dem Index 1 starten, d. H.' I = 1' in for-Schleife –
Und was ist, wenn es mehr als 1 kleinste Element gibt? –
@ImranAli nein, dann wird es die kleinste-so-weit auf 0 jedes Mal, wenn es eine neue kleinste findet –