【问题描述】
输入一组无序的整数,编程输出其中出现次数最多的整数及其出现次数。
【输入形式】
先从标准输入读入整数的个数(大于等于1,小于等于100),然后在下一行输入这些整数,各整数之间以一个空格分隔。
【输出形式】
在标准输出上输出出现次数最多的整数及其出现次数,两者以一个空格分隔;若出现次数最多的整数有多个,则按照整数升序分行输出。
【样例输入】
10 0 -50 0 632 5813 -50 9 -50 0 632
【样例输出】
-50 3 0 3
【样例说明】
输入了10个整数,其中出现次数最多的是-50和0,都是出现3次。
#include<stdio.h>
typedef struct {
int num;
int times;
}numbers;
int main(){
int a[101];
numbers b[101];
int n, i, j, temp, max, m;
scanf("%d", &n);
for(i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for(i = 0; i < n - 1; i++) {
for(j = 0; j < n - i - 1; j++) {
if(a[j] > a[j + 1]) {
temp = a[j];
a[j] = a[j + 1];
a[j + 1] = temp;
}
}
}
j = 0;
b[j].num = a[0];
b[j].times = 0;
for(i = 0; i < n; i++) {
if(a[i] != a[i + 1]) {
b[j].times++;
j++;
b[j].num = a[i + 1];
b[j].times = 0;
}
else {
b[j].times++;
}
}
m = j;
max = 0;
for(i = 0; i <= m; i++) {
if (b[i].times > max) {
max = b[i].times;
}
}
for(i = 0; i <= m; i++) {
if (b[i].times == max) {
printf("%d %d\n", b[i].num, b[i].times);
}
}
return 0;
}
#另附一种转载的做法:
#include<stdio.h>
int main() {
int a[50], b[50], c[50], n, i, j, t, max;
scanf("%d", &n);
for(i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for(i = 1; i < n; i++) {
for(j = 0;j < n - 1; j++) {
if (a[j] > a[j + 1]) {
t = a[j];
a[j] = a[j + 1];
a[j+1] = t;
}
}
}
j = 0;
t = -1;
for(i = 0; i < n - 1; i++) {
if (a[i] != a[i+1]) {
b[j] = i - t;
c[j] = i;
t = i;
j++;
}
}
b[j] = n - 1 - t;
c[j] = n - 1;
max = b[0];
for (i = 1;i <= j; i++) {
if(max < b[i]) {
max = b[i];
}
}
for (i = 0; i <= j; i++) {
if (b[i] == max) {
t = c[i];
printf("%d %d\n",a[t],b[i]);
}
}
return 0;
}