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

任务描述
于龙在运动会上和多位女同学进行跳绳比赛,现在需要一个排名程序,先输入每位同学的成绩,再输出每位同学的成绩及排名。
输入格式:
若干个空格分隔的整数,代表每个人的成绩。人数最少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
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(ido i++;while(a[i]>a[mid]);
        do j--;while(a[j][mid]);
        if(iint 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;iif(a[i]==a[i-1])
          printf("%lld - %lld\n",c,a[i]);
        else
        {
            c=i+1;
            printf("%lld - %lld\n",c,a[i]);
        }
    }
}


#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]);
        }
    }
}

你只考虑两个成绩相等,根本没有考虑过3个以上成绩相等

c是int类型,不是long long类型