z_J_YYYYY 2021-08-25 07:03 采纳率: 50%
浏览 39
已结题

关于#c++#数字排序的问题

为什么这个题我这样的解法就不对呀?

img

#include <iostream>
#define endl '\n'
using namespace std;
int n=0;
int a[1000]={0};
int sign[1001]={0};

int findmax()
{
    int max=0;
    int maxnum=0;
    for(int i=0;i<1000;i++)
    {
        if(sign[i]==0)
        {
            continue;
        }
         else
         {
             if(sign[i]>maxnum)
             {
                 max=i;
                 maxnum=sign[i];
            }
        }
    } 
    return max;
}

int main()
{
    int t=0,num=0;
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        sign[a[i]]++;
    }
    for(int i=0;i<1000;i++)
    {
        if(sign[i]==0)
        {
            continue;
        }
         else
         {
             num++;
         }
    }
    for(int i=0;i<num;i++)
    {
        t=findmax();
        cout<<t<<" "<<sign[t]<<endl;
        sign[t]=0;
    }
} 

展开全部

  • 写回答

3条回答 默认 最新

  • StjpStjp 2021-08-25 07:07
    关注
    如果我的回答对你有帮助,请点击旁边的采纳按钮,谢谢

    你这可能是思路没问题,写代码的时候糊涂了

    因为这个代码写到后面意思就不对了


    思路应该是这样的:

    1.将所有数字排序

    for(i=1;i<n;i++){
            for(j=i;j>0&&array[j]<array[j-1];j--){
                temp=array[j];
                array[j]=array[j-1];
                array[j-1]=temp;
            }
        }
    
    
    

    2.统计次数

    result[0][0]=array[0];
        result[0][1]=1;
        count=0; 
        for(i=1;i<n;i++){
            if(array[i]==result[count][0]){
                result[count][1]++;
            }else{
                count++;
                result[count][0]=array[i];
                result[count][1]=1;
            }
        }
    
    
    

    3.对次数进行排序

        for(i=1;i<=count;i++){
            for(j=i;j>0&&result[j][1]>result[j-1][1];j--){
                temp=result[j][0];
                result[j][0]=result[j-1][0];
                result[j-1][0]=temp;
                
                temp=result[j][1];
                result[j][1]=result[j-1][1];
                result[j-1][1]=temp;
            }
        }
    
    
    

    具体代码如下:

    /*
    问题描述 
     给定 n 个整数,请统计出每个整数出现的次数,按出现次数从多到少
    的顺序输出。
    输入格式 
     输入的第一行包含一个整数 n,表示给定数字的个数。
     第二行包含 n 个整数,相邻的整数之间用一个空格分隔,表示所给定
    的整数。
    输出格式 
     输出多行,每行包含两个整数,分别表示一个给定的整数和它出现的
    次数。按出现次数递减的顺序输出。如果两个整数出现的次数一样多,则
    先输出值较小的,然后输出值较大的。(1 ≤ n ≤ 1000,)
    样例输入 
    12
    5 2 3 3 1 3 4 2 5 2 3 5
    样例输出 
    3 4
    2 3
    5 3
    1 1
    4 1
    */
    #include<stdio.h>
    int main(void){
        int n;
        int i,j,temp,count;
        printf("请输入数字个数:");
        scanf("%d",&n);
        int array[n];
        int result[n][2];
        //输入数据 
        printf("请输入数据:");
        for(i=0;i<n;i++){
            scanf("%d",&array[i]);
        }
        //对数字排序
        for(i=1;i<n;i++){
            for(j=i;j>0&&array[j]<array[j-1];j--){
                temp=array[j];
                array[j]=array[j-1];
                array[j-1]=temp;
            }
        }
        //统计次数
        result[0][0]=array[0];
        result[0][1]=1;
        count=0; 
        for(i=1;i<n;i++){
            if(array[i]==result[count][0]){
                result[count][1]++;
            }else{
                count++;
                result[count][0]=array[i];
                result[count][1]=1;
            }
        }
        //对次数进行排序
        for(i=1;i<=count;i++){
            for(j=i;j>0&&result[j][1]>result[j-1][1];j--){
                temp=result[j][0];
                result[j][0]=result[j-1][0];
                result[j-1][0]=temp;
                
                temp=result[j][1];
                result[j][1]=result[j-1][1];
                result[j-1][1]=temp;
            }
        } 
        //输出
        for(i=0;i<=count;i++){
            printf("%d\t%d\n",result[i][0],result[i][1]);
        } 
        return 0;
    }
    
    
    

    展开全部

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 9月1日
  • 已采纳回答 8月25日
  • 修改了问题 8月25日
  • 创建了问题 8月25日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部