要實現(xiàn)的算法是:求整個數組的和、在數組中找最值。
找最值,可以先把第一個元素賦給max、min變量,做一次遍歷,一一比較,把最大值存入max,最小值存入min。
也可以直接對數組進行排序,然后從第二個加到倒數第二個,這樣就可以了,省去減兩個最值。 ?
編碼建議
Programing
?
我的代碼采用的是第一種方法。因為對于本題來說,它的效率是O(N)。
算法不難,可以直接看代碼
這里稍微討論一下第二種方法。
對于排序,我們可以直接調用庫函數qsort();
語法:
#include
功能: 對buf 指向的數據(包含num 項,每項的大小為size)進行快速排序。如果函數compare 的第一個參數小于第二個參數,返回負值;如果等于返回零值;如果大于返回正值。函數對buf 指向的數據按升序排序。
#include#includeint?cmp(const?double?*a,?const?double?*b){return?*a?>?*b???1?:?*a?<?*b???-1?:?0;}int?main(void){int?n,?i;double?x,?y[100];while?(scanf("%d",?&n)?!=?EOF){for?(i?=?0?;?i?<?n?;?i++)scanf("%lf",?y?+?i);qsort(y,?n,?sizeof(double),?cmp);for?(x?=?0,?i?=?1?;?i?<?n?-?1?;?i++)x?+=?y[i];printf("%.2fn",?x?/?(n?-?2));}return?0;}你可能有疑問,為什么cmp函數不直接用return *a - *b;
這也就是我不打算用這種方法的原因了(雖然上面的代碼可以Accpted),這就是這段代碼的不穩(wěn)定因素。
我們來做個實驗:
#include#includeint?main(void){int?i;double?x;x?=?0.123456;printf("%lfn",?x);for?(i?=?0?;?x?-?floor(x);?i++)x?*=?10;printf("%dn",?i);return?0;}上面的代碼的作用就是確定X小數點后有幾位。
我相信所有人都知道它有6位小數。但它的運行結果卻是17(因編譯器而異)。
你可以自己復制代碼去驗證一下。
我們在循環(huán)體里插入printf("%lfn", floor(x));看看它的變化是怎樣的。
運行結果:
1.000000
12.000000
123.000000
1234.000000
12345.000000
123455.000000
1234559.000000
12345599.000000
123455999.000000
1234559999.000000
12345599999.000000
123455999999.000000
1234559999999.000000
12345599999999.000000
123455999999999.000000
1234559999999999.000000
12345599999999998.000000
這就是double型數據的精度問題。這是我們無法人為地控制的。所以建議盡量避免double的高精度運算。 ?
#includeint?main(void)
{
????int?n,?i;
????double?min,?max;
????double?x,?y;
????
????while?(scanf("%d",?&n)?!=?EOF)
????{
????????scanf("%lf",?&x);
????????min?=?max?=?x;
????????for?(i?=?1?;?i?<?n?;?i++)
????????{
????????????scanf("%lf",?&y);
????????????x?+=?y;
????????????if?(y?>?max)?max?=?y;
????????????if?(y?<?min)?min?=?y;
????????}
????????printf("%.2lfn",?(x?-?min?-?max)?/?(n?-?2));
????}
????return?0;
}




