要實現(xiàn)的算法是:求整個數(shù)組的和、在數(shù)組中找最值。
找最值,可以先把第一個元素賦給max、min變量,做一次遍歷,一一比較,把最大值存入max,最小值存入min。
也可以直接對數(shù)組進(jìn)行排序,然后從第二個加到倒數(shù)第二個,這樣就可以了,省去減兩個最值。 ?
編碼建議
Programing
?
我的代碼采用的是第一種方法。因為對于本題來說,它的效率是O(N)。
算法不難,可以直接看代碼
這里稍微討論一下第二種方法。
對于排序,我們可以直接調(diào)用庫函數(shù)qsort();
語法:
#include
功能: 對buf 指向的數(shù)據(jù)(包含num 項,每項的大小為size)進(jìn)行快速排序。如果函數(shù)compare 的第一個參數(shù)小于第二個參數(shù),返回負(fù)值;如果等于返回零值;如果大于返回正值。函數(shù)對buf 指向的數(shù)據(jù)按升序排序。
#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函數(shù)不直接用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小數(shù)點后有幾位。
我相信所有人都知道它有6位小數(shù)。但它的運行結(jié)果卻是17(因編譯器而異)。
你可以自己復(fù)制代碼去驗證一下。
我們在循環(huán)體里插入printf("%lfn", floor(x));看看它的變化是怎樣的。
運行結(jié)果:
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型數(shù)據(jù)的精度問題。這是我們無法人為地控制的。所以建議盡量避免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; }