求中间数:CCF计算机职业资格认证考试模拟试题,编号:201612-1

来源:互联网 发布:软件售后工程师 编辑:程序博客网 时间:2024/04/29 17:23
问题描述
  在一个整数序列a1, a2, …, an中,如果存在某个数,大于它的整数数量等于小于它的整数数量,则称其为中间数。在一个序列中,可能存在多个下标不相同的中间数,这些中间数的值是相同的。
  给定一个整数序列,请找出这个整数序列的中间数的值。
输入格式
  输入的第一行包含了一个整数n,表示整数序列中数的个数。
  第二行包含n个正整数,依次表示a1, a2, …, an
输出格式
  如果约定序列的中间数存在,则输出中间数的值,否则输出-1表示不存在中间数。
样例输入
6
2 6 5 6 3 5
样例输出
5
样例说明

  比5小的数有2个,比5大的数也有2个。

样例输入
4
3 4 6 7
样例输出
-1
样例说明
  在序列中的4个数都不满足中间数的定义。
样例输入
5
3 4 6 6 7
样例输出
-1
样例说明
  在序列中的5个数都不满足中间数的定义。
评测用例规模与约定
  对于所有评测用例,1 ≤ n ≤ 1000,1 ≤ ai ≤ 1000。
解题思路:首先讲输入的数组按从小到大进行排序,求出中位数,然后将大于中位数的用big_than_middle计数,将小于中位数的用little_than_middle计数,判断两个数的大小,按要求输出结果。
代码如下:(该程序在debian系统下成功运行,在该题所在网站也成功提交正确)

#include<stdio.h>
 #include<malloc.h>
int sort(int count,int *array)                                //采用直接插入算法对数组进行排序
  { /*直接插入排序(straight insertion sort)是一种简单的排序算法,基本思想是将第一个元素当做一个有序的子序列,然后从第二个记录依次进行插入,首先与已经排序好的有序子序列最大的数max进行比较,若大于等于max,则它就在原位置,若小于max,则向前继续与有序自序列max之前的数进行比较,直到找到小于的数的位置,插入该位置,将有序子序列依次向后移动一位*/


int i;
int j;
int e;
for(i=1;i<count;i++)
{
e=array[i];
for(j=i-1;j>=0&&e<array[j];j--)
 {
   array[j+1]=array[j];
 }
array[j+1]=e;
}
  }
  
 int  result(int *array,int count)                            //结果返回函数
 { 
    int e;
    int middle=count/2;
int i,little_than_middle=0,big_than_middle=0;
for(i=0;i<count;i++)
{
if(array[i]<array[middle])
 little_than_middle++;
else if(array[i]>array[middle])
 big_than_middle++;
else
 ;
}
if(little_than_middle==big_than_middle)
return array[middle];
else
return -1;
 }
 int main(void)                                //main函数

int count;
int *array;
int i;
scanf("%d",&count);
array=(int*)malloc(sizeof(int)*count);         //为将要输入的整数申请内存
for(i=0;i<count;i++)
  {
scanf("%d",&array[i]);
  }
  sort(count,array);
printf("%d\n",result(array,count));
free(array);                               //释放申请内存
return 0;
}
<script src="https://code.csdn.net/snippets/2258859.js"></script>

0 0
原创粉丝点击