快乐打码 2023-02-02 12:47 采纳率: 70.6%
浏览 55

请问样例都过了,为什么还是部分正确,这样写还存在什么问题吗?要怎么改

任务描述
于龙在运动会上和多位女同学进行跳绳比赛,现在需要一个排名程序,先输入每位同学的成绩,再输出每位同学的成绩及排名。
输入格式:
若干个空格分隔的整数,代表每个人的成绩。人数最少1人最多不会超过1000人。
输出格式:
按行输出名次和成绩,之间用一个横线分隔,横线前后各一个空格,横线就是减号。
输入样例:
150 120 180 135 100
输出样例:
1 - 180
2 - 150
3 - 135
4 - 120
5 - 100
输入样例:
150 120 150 135 120
输出样例:
1 - 150
1 - 150
3 - 135
4 - 120
4 - 120

#include<stdio.h>
long long  a[1010],x;
int k;
void quick_sort(long long a[],int l,int r)
{
    if(l>=r)
        return;
    int mid=(l+r+1)/2;
    int i=l-1,j=r+1;
    while(i<j)
    {
        do i++;while(a[i]>a[mid]);
        do j--;while(a[j]<a[mid]);
        if(i<j)
        {
            int t=a[i];
            a[i]=a[j];
            a[j]=t;
        }
    }
    quick_sort(a,l,i-1);quick_sort(a,i,r);
}
int main()
{
    k=0;
    while(~scanf("%lld",&x))
    {
       a[k++]=x; 
    }
    quick_sort(a,0,k-1);
      printf("%lld - %lld\n",1,a[0]);
    int c=1;
    for(int i=1;i<k;i++)
    {
      if(a[i]==a[i-1])
          printf("%lld - %lld\n",c,a[i]);
        else
        {
            c=i+1;
            printf("%lld - %lld\n",c,a[i]);
        }
    }
}

  • 写回答

3条回答 默认 最新

  • m0_54204465 2023-02-02 13:18
    关注
    
    #include<stdio.h>
    #include<stdlib.h>
    
    #define MAX_N 1010
    
    int n, a[MAX_N], b[MAX_N];
    
    int cmp(const void *a, const void *b)
    {
        return *(int *)b - *(int *)a;
    }
    
    int main()
    {
        scanf("%d", &n);
        for (int i = 0; i < n; i ++)
        {
            scanf("%d", &a[i]);
            b[i] = a[i];
        }
    
        qsort(a, n, sizeof(int), cmp);
        for (int i = 0; i < n; i ++)
        {
            for (int j = 0; j < n; j ++)
            {
                if (a[i] == b[j])
                {
                    printf("%d-%d\n", i + 1, b[j]);
                    b[j] = -1;
                    break;
                }
            }
        }
    
        return 0;
    }
    

    根据题意,名次是用成绩排名,如果成绩相同,则名次相同。
    你代码中,如果成绩相同,没有对名次进行处理,直接从i+1赋值给c,但实际名次并不是i+1。

    解决方法:当成绩相同时,c不变,依然为之前的名次。

    下面是修改后的代码:

    #include<stdio.h>
    
    long long  a[1010], x;
    int k;
    
    void quick_sort(long long a[], int l, int r)
    {
        if (l >= r)
            return;
        int mid = (l + r + 1) / 2;
        int i = l - 1, j = r + 1;
        while (i < j)
        {
            do i++; while (a[i] > a[mid]);
            do j--; while (a[j] < a[mid]);
            if (i < j)
            {
                int t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
        }
        quick_sort(a, l, i - 1); quick_sort(a, i, r);
    }
    
    int main()
    {
        k = 0;
        while (~scanf("%lld", &x))
        {
            a[k++] = x;
        }
        quick_sort(a, 0, k - 1);
        printf("%lld - %lld\n", 1, a[0]);
        int c = 1;
        for (int i = 1; i < k; i++)
        {
            if (a[i] == a[i - 1])
                printf("%lld - %lld\n", c, a[i]);
            else
            {
                c = i + 1;
                printf("%lld - %lld\n", c, a[i]);
            }
        }
    }
    
    
    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 2月2日

悬赏问题

  • ¥15 暴雪战网api相关问题
  • ¥15 而使用UE5引擎的 工具选项里 打开c++ visual studio 就会有部分显示加载失败 如图 加载失败的这张图 请问是什么原因
  • ¥15 mysql 对多个字段模糊查询,返回第一个匹配的字段
  • ¥15 the testing results of the whole dataset is empty
  • ¥15 can问题,往哥解决
  • ¥15 FFmpeg 成功推流到 Nginx RTMP 服务器但无法用 ffplay 或 VLC 播放
  • ¥15 请修改以下C语言代码使其能正确输出最短路径
  • ¥20 抖音商城拉码器安卓报错求解决办法或者有新的拉码脚本也可以介绍一下
  • ¥15 MPLAB IDE V2.35 报错make[2]: *** [build/default/production/_ext/1472/MSSP_I2C.p1] Error 1
  • ¥15 在国外文献网站里点击view pdf 加载异常缓慢甚至加载不出来。