我正在尝试创建一个C函数,它接受一个数组,找到最小的元素,并将该元素的值设置为零。
到目前为止,这是我的功能。
void find_minimum(double a[], int n) {
int i, smallest = 0;
smallest = a[0];
for (i = 0; i < n; i++) {
if (a[i] < smallest) {
smallest = a[i];
}
a[i] = 0;
}
}
当我运行它时,除最后一个之外的每个索引都为零,但我只希望最小的元素为零。
答案 0 :(得分:2)
您的代码存在一些问题,我很惊讶您的编译器没有爆炸。
void find_minimum(double a[], size_t n) {
size_t i, index;
double smallest;
// sanity check to make sure we're not accessing outside allocated memory
if (n > 0) {
smallest = a[0];
index = 0;
} else {
// nothing left to do here
return;
}
// start at 1 because 0 is initial default
for (i = 1; i < n; i++) {
if (a[i] < smallest) {
smallest = a[i];
index = i;
}
}
// assign only the smallest index
a[index] = 0.0;
}
如果您有任何问题,请随时发表评论。
答案 1 :(得分:1)
如果我们假设只有一个最小的OP和一些答案,我们也可以跟踪最小的索引,而不是最小的索引,以保持简单:
void find_minimum(double a[], size_t n) {
if (n <= 0) {
return;
}
size_t smallest = 0;
for (size_t i = 1; i < n; i++) {
if (a[i] < a[smallest]) {
smallest = i;
}
}
a[smallest] = 0.0;
}
答案 2 :(得分:0)
我想解决有多个唯一最小值的情况。
在这种情况下,需要两个循环。一个用于找出整个数组中的最小值,另一个用于将具有该值的所有元素设置为零。
我会跟踪数值在数组中出现的最小和最大索引,以最小化第二个循环的范围:
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有一个实例。