You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

54 lines
1.4 KiB

#include <stdio.h>
void Middle();
void getMode();
int main()
{
int Mode = 0, Mult = 0, *p, *q;
p = &Mode, q = &Mult;
int i, n;
printf("请输入整数序列中整数的个数:");
scanf("%d", &n);
int a[n];
printf("请输入整数序列:\n");
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
getMode(p, q, a, n);
printf("众数:%d\n", Mode);
printf("重数:%d\n", Mult);
return 0;
}
void Middle(int a[], int n, int b[]) //确定左右界
{
int i, mid = n / 2; //取中间数字mid为界
for (i = 0; i <= mid; i++) //找左界
if (a[i] == a[mid])
{
b[0] = i;
break; //此时b[0]为左界
}
for (i = mid + 1; i < n; i++) //找右界
if (a[i] != a[mid])
{
b[1] = i;
break; //此时b[1]为右界
}
}
void getMode(int *Mode, int *Mult, int a[], int n) //求众数和重数
{
int tempNum, i = 0;
int b[2] = {0, 0};
int mid = n / 2;
Middle(a, n, b);
tempNum = b[1] - b[0];
if (tempNum > *Mult) //如果中间数字的个数大于现在的重数,则更新
{
*Mode = a[mid];
*Mult = tempNum;
}
if (b[0] + 1 > *Mult) //如果左边的个数>maxnum,则在左部开始搜索
getMode(Mode, Mult, a, b[0] + 1);
if (n - b[1] > *Mult) //如果右边的个数>maxnum,则在右部开始搜索
getMode(Mode, Mult, a + b[1], n - b[1]);
}