C语言 · 2022年5月19日 2

整数出现次数统计

【问题描述】

输入一组无序的整数,编写程序按照整数出现次数由多到少输出整数及其出现次数,若出现次数相同,则按照输入顺序输出。

【输入形式】

先从标准输入读入整数的个数(大于等于1,小于等于100),然后在下一行输入这些整数,各整数之间以一个空格分隔。

【输出形式】

在标准输出上按照整数出现次数由多到少输出整数及其出现次数,每行显示一个整数及其出现次数,两者以一个空格分隔,出现次数后跟一个回车;若出现次数相同,则按照输入顺序输出。

【样例输入】

10

0 -50 0 632 5813 -50 9 -50 0 632

【样例输出】

0 3

-50 3

632 2

5813 1

9 1

【样例说明】

输入了10个整数,其中0和-50出现3次,0先输入,所以先输出0及其出现次数,再输出-50及其出现次数;632出现了2次;5813和9只出现1次,5813先出现先输出。

【评分标准】

该程序要求输出整数及其出现次数,提交程序文件名为exam1.c或exam1.cpp。


#include <stdio.h>
#include <stdlib.h>

void input(int *p, int n)
{
    for(int i = 0; i < n; i++)
    {
        scanf("%d", p + i);
    }
}

void output(int *p, int *q, int n)
{
    for(int i = 0; i < n; i++)
    {
        printf("%d %d\n", *(p + i), *(q + i) );
    }
}

void copy(int *p, int *q, int n)
{
    for(int i = 0; i < n; i++)
    {
        *(q+i) = *(p+i);
    }
}

int removesame(int *p, int n)
{
    int i, j, k;
    for(i = 0; i < n; i++)
    {
        for(j = i+1; j < n; j++)
        {
            if(p[i] == p[j])
            {
                for(k = j; k < n; k++)
                {
                    p[k] = p[k+1];
                }
                j--;
                n--;
            }
        }
    }
    return n;
}

int *count(int *p, int n, int *q,int len)
{
    int *arr;
    arr = (int *)malloc(sizeof(int)*len);
    for(int i = 0; i < len; i++)
    {
        arr[i] = 0;
        for(int j = 0; j < n; j++)
        {
            if(q[i] == p[j])
            {
                arr[i] += 1;
            }
        }
    }
    return arr;
}

int main()
{
    int n;
    scanf("%d", &n);
    int num[n], removed[n];
    input(num,n);
    copy(num,removed,n);
    int len = removesame(removed,n);
    int *countnum;
    countnum = count(num,n,removed,len);
    output(removed,countnum,len);
    return 0;
}