公平不公平 程序算出来
数字职场
本期挑战题目
一个神奇的八位数,乘以9的倍数,得到的都是一串相同的数字,你会编程推算出这个的八位数吗?
平均值在编程中很常见,常常被用来作为判断,标准是否超出平均值、是否未达到平均值等,特别是在工业编程上,平均值判断常常被用来控制产品的生产。听起来,编写平均值判断非常枯燥,难道没有好玩、有趣的吗?
本期题目:电视上的比赛,经常需要评委打分,一般显示的都是平均分,你能编程显示最公平和最不公平的打分吗?
题目中的公平是什么?不要想当然的认为打分最低的就是最不公平的、分数在中间的就是最公平的。一般来说,比赛中的平均分都是去掉最高分、最低分后得出的,所以和平均分差异最大的就是最不公平的,和平均分差异最小的就是最公平的。
明白了这点,就好办了。先求出平均分,然后再依次求出每个评委得分和平均分之间差值的绝对值,这些差值中最大的就是最不公平的评委,而差值最小的就是最公平的评委。是不是很简单?
循环计算
通过循环,分别求出最大值、最小值和所有评分的总和,然后用总和减去最大值和最小值,再通过除法得出平均分,最后通过一一比较得到答案,关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):
int[] score = {100,64,58,92,91,85,80,70,
60,64}; //假设评委有10个,一共有10个打分
int maxIndex = 0; //最大值数组下标
int minIndex = 0; //最小值数组下标
int sum = 0; //存储和
int len = score.length; //评委个数
//求最大值
for(int i = 0;i < len;i++){
if(score[maxIndex] < score[i]){
maxIndex = i;
}
}
//求最小值
for(int i = 0;i < len;i++){
if(score[minIndex] > score[i]){
minIndex = i;
//最公平评委
int bestJuryIndex = 0;
for(int i = 0;i < len;i++){
if(absValue[bestJuryIndex] > absValue[i]){
bestJuryIndex = i;
}
}
//最不公平评委
int worstJuryIndex = 0;
for(int i = 0;i < len;i++){
if(absValue[worstJuryIndex] < absValue[i]){
worstJuryIndex = i;
进阶方法
上面的方法,估计大家都想得到,但这种方法明显效率不高,通过合并部分循环就可以实现提高代码执行速度的目的,关键代码如下所示(完整代码下载地址:http://www.shudoo.com/bzsoft):
//最公平评委、最不公平评委
int bestJuryIndex = 0;
int worstJuryIndex = 0;
for(int i = 0;i < len;i++){
if(absValue[bestJuryIndex] > absValue[i]){
bestJuryIndex = i;
}
if(absValue[worstJuryIndex] < absValue[i]){
worstJuryIndex = i;
实际应用
本文介绍的平均值判断,虽然简单,但应用范围却很广,例如数据库管理软件(常见的有Oracle、SQL Server、MySQL等)中就嵌入了平均值判断的功能,帮助用户高效、便捷地管理数据库。
此外,在普通人的生活中也时常可以看到平均值判断的身影,大家所熟知的股票软件中的均线,就用到了平均值判断,例如30日均线就是大盘30天的收盘价再除以30形成30日均点,然后依次连接均点就形成30日均线 。
露一手
上期的题目,很多编程爱好者踊跃参与,其中来自江西南昌的周凯童鞋,非常耀眼,他是唯一一个提供了3种心形图形编程方法的人,第二种方法比较有意思,用ASCII码直接输出“■”(见图),他的思维非常活跃,值得大家借鉴。我们将给予周凯童鞋现金奖励。
