任务描述
于龙在运动会上和多位女同学进行跳绳比赛,现在需要一个排名程序,先输入每位同学的成绩,再输出每位同学的成绩及排名。
输入格式:
若干个空格分隔的整数,代表每个人的成绩。人数最少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类型