[英]C find the 2 largest numbers and 2 smallest numbers in float array
我真的很沮喪,我一整天都在努力使它起作用,但從未弄清楚。 我需要從arr[11]
找到2 largest
和2 smalllest
數字。
到目前為止,這是我所做的:
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;
}
您可以對其進行排序,但是如果數組變大,它將為O(n log n)。 不過,這對於11個元素來說是無關緊要的,如果您確定它始終為11,那么排序將是最簡單的方法。
如果不這樣做,從理解代碼的角度來看,最簡單的方法是:
就您擁有的代碼而言,問題出在這里:
while (min == min2){
min2 = arr[1 + i];
i++;
}
這是在您的第一個循環之后, i
從1到10。在循環結束時, i
的值應該是11。但是現在您一直在掃描,而i
仍在增加...您已經越過數組末尾!
您實際上必須從11個總體中排序4個元素。您還必須處理極端情況,例如極端元素相等。
qsort
,請考慮對數組進行排序 (使用qsort
),然后取出前兩個元素和最后兩個元素作為答案。
確實,您不必要對7個元素進行排序,但是作為補償,您的代碼將很穩定,因為它使用標准庫函數來完成艱苦的工作。 qsort
的對數算法不會為此qsort
太多qsort
,因為4和11在對數空間中的大小相似。
當然,如果總體數量增加,因此O(N Log N)變大,那么如果您的用例需要,則可能必須切換到手動編碼解決方案。
我認為您需要在這部分代碼之前重新初始化i
的值。 它超出了數組的范圍,因為i
for循環值之后為11
。
while (min == min2){
min2 = arr[1 + i];
i++;
}
在此之前加i = 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
進行比較總是錯誤的,即使NAN == NAN
也是錯誤的。 使用!(a<=b)
,如果a
大於b
或a
為NAN
或b
為NAN
,則比較為true。
注意:僅顯示問題的最大一半。 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.