我真的很沮丧,我整日都努力让它成功,但从来没有弄明白。
我需要从2 largest
找到2 smalllest
和arr[11]
个数字。
这是我到目前为止所做的事情:
int main(){
float arr[11] ,max = 0, max2, min, min2;
int i = 0;
for (i = 0; i < 11; i++){
scanf("%f", &arr[i]);
}
max = arr[0];
max2 = arr[0];
min = arr[0];
min2 = arr[0];
for (i = 1; i < 11; i++){
if (arr[i] > max)
max = arr[i];
if (arr[i] < min)
min = arr[i];
}
while (min == min2){
min2 = arr[1 + i];
i++;
}
for (i = 10; i > 0; i--){
if (arr[i] > max2 && arr[i] < max)
max2 = arr[i];
if (arr[i] < min2 && arr[i] > min)
min2 = arr[i];
}
printf("Max = %.2f\nMax2 = %.2f\nMin = %.2f\nMin2 = %.2f", max, max2, min, min2);
getch();
return 0;
}
答案 0 :(得分:2)
你可以对它进行排序,但如果数组变得更大,那将是O(n log n)。但是,它与11个元素无关,如果你确定它总是11个,那么排序将是最简单的方法。
如果做不到这一点,从理解代码的角度来看,最简单的方法是:
就您所拥有的代码而言,问题在于:
while (min == min2){
min2 = arr[1 + i];
i++;
}
这是在你的第一个循环之后,其中i
从1到10运行。在循环结束时,i
的值将是11.但是现在你要保持扫描,i
仍然在增加......你已经超越了数组的末尾!
答案 1 :(得分:1)
你实际上必须从11个人口中排序4个元素。你还必须处理极端元素相等的边缘情况。
考虑到这一点,考虑排序数组(使用qsort
)然后取出前两个元素作为答案。
实际上,您不必要地对7个元素进行排序,但是,在补偿方面,您的代码将是稳定的,因为它使用标准库函数来完成艰苦的工作。 qsort
的对数算法不会对你造成过多的惩罚,因为4和11在对数空间中具有相似的幅度。
当然,如果人口规模增加使得O(N Log N)变大,那么如果您的用例需要,则可能必须切换到手动编码的解决方案。
答案 2 :(得分:0)
我认为您需要在此部分代码之前重新启动i
的值。它超出了数组范围,因为之前for循环值i
为11
。
while (min == min2){
min2 = arr[1 + i];
i++;
}
在此之前添加i = 0
。
另请注意,当此数组中的所有浮点数相等时,部分代码将无限期。
答案 3 :(得分:0)
只需要1次传球。首先将每个值与非极端值进行比较。
如果允许绑定,请使用>=
和<=
。
max2 = -FLT_MAX; // greatest
max = -FLT_MAX; // almost greatest
min = FLT_MAX; // almost least
min2 = FLT_MAX; // least
for (i = 0; i < 11; i++){
if (arr[i] > max) {
max = arr[i];
if (max > max2) {
max = max2;
max2 = arr[i];
}
}
if (arr[i] < min) {
min = arr[i];
if (min < min2) {
min = min2;
min2 = arr[i];
}
}
}
printf("Max = %.2f\nMax2 = %.2f\nMin = %.2f\nMin2 = %.2f", max, max2, min, min2);
一种漂亮的方法使用NAN
- 而不是数字。请注意!(a<=b)
而不是(a>b)
。由于NAN
,这些是不同的。与NAN
相比,总是为false,即使NAN == NAN
为false。使用!(a<=b)
时,如果a
大于b
或a
为NAN
或b
为NAN
,则比较为真}。
注意:只显示问题的最大一半。 0.0 / 0.0 - > NAN。
// Initialize both to NAN
max2 = 0.0f/0.0f; // greatest
max = 0.0f/0.0f; // almost greatest
for (i = 0; i < 11; i++) {
if (!(arr[i] <= max)) {
max = arr[i];
if (!(max <= max2)) {
max = max2;
max2 = arr[i];
}
}
}
printf("Max = %.2f\nMax2 = %.2f\n", max, max2);