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
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]);
|
|
}
|
|
|