问题描述
统计n个正整数中每个数出现的次数。
输入说明
第一行是一个整数n(5<n<30),表示要待统计整数的个数;
第二行是n个整数,每个整数均小于100000
输出说明
按照整数从小到大的顺序依次输出不同的整数及其出现次数,整数和出现次数之间用冒号(:)分隔。
输入样例
12
19 223 35 321 2 33 44 223 2 19 2 19
输出样例
2:3
19:3
33:1
35:1
44:1
223:2
321:1
思路:先将所给的数据进行冒泡排列,这样就可以初步满足输出顺序
#include <stdio.h>
int main() {
int i, j, k, n;
scanf("%d", &n);
int a[n];
for (i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for (i = 1; i < n; i++) {
for (j = 0; j < n - i; i++) {
if (a[j] > a[j + 1]) {
k = a[j + 1];
a[j + 1] = a[j];
a[j] = k;
}
}
}
int count[n];
for (i = 0; i < n; i++) {
int sum = 1;
for (j = 1; j < n - i; j++)
if (a[i] == a[i + j]) {
sum++;
};
count[i] = sum;
}
for (i = 0; i < n; i++) {
printf("%d:%d\n", a[i], count[i]);
}
}
会得到如下结果
现在我们需要将重复的的数据去掉,这时候我们可以考虑将数组中重复的数字去掉,这时我们采用i = i + count[i] - 1;只输出我们需要的的项即可。
于是最终代码为:
#include <stdio.h>
int main() {
int n, i;
scanf("%d", &n);
int a[n];
for (i = 0; i < n; i++)
scanf("%d", &a[i]);
int j, k, l;
for (j = 1; j < n; j++) {
for (k = 0; k < n - j; k++) {
if (a[k] > a[k + 1]) {
l = a[k], a[k] = a[k + 1], a[k + 1] = l;
}
}
}
int count[n];
for (i = 0; i < n; i++) {
int sum = 1;
for (j = 1; j < n - i; j++)
if (a[i] == a[i + j]) {
sum++;
};
count[i] = sum;
}
for (i = 0; i < n; i++) {
printf("%d:%d\n", a[i], count[i]);
i = i + count[i] - 1;
}
}
运行结果为: