今天在中国程序员论坛上看到一个题目,大家看看还有没有其它的解法
题目:输入一个数组,输入结束时打印出排序,如输入的数组为98 82 2 73 80 则输出为98 1
82 2
2 5
73 4
80 3
以下是楼主的答案:
#include<stdio.h>
#include<stdlib.h>
#define MAX 100
#define MIN 0
int main(void)
{
int score[MAX+1]={0};
int juni[MAX+2]={0};
int count=0,i;
do
{
printf("输入分数,-1结束:");
scanf("%d", &score[count++]);
}
while(score[count-1]!=-1);
count--;
for(i=0;i<count;i++)
juni[score[i]]++;
juni[MAX+1]=1;
for(i=MAX;i>=MIN;i--)
juni[i]=juni[i]+juni[i+1];
printf("得分\t排行\n");
for(i=0;i<count;i++)
printf("%d\t%d\n",score[i],juni[score[i]+1]);
return 0;
}
下面是我的解法:
#include<stdio.h>
#include<stdlib.h>
void sort(int *pArr,int len);
int main()
{
int i=0,j=0,k=0,flag=1;
int *Arr1;//用户输入的数组
int *Arr2;//再造一个数组
printf("请依次输入数组的各项(用空格隔开),输入-1时输入结束\n");
Arr1=(int *)malloc(1*sizeof(int));
while(flag)//此循环为当输入的值不为-1时,将输入结果存储到一个动态数组中
{
scanf("%d",&Arr1[i]);
if(Arr1[i]==-1)
break;
else
{
Arr1=(int *)realloc(Arr1,1*sizeof(int));//在原来的基础上再动态分配内存
k++;
i++;
flag=1;
}
}
Arr2=(int *)malloc(k*sizeof(int)); //再动态构造一个长度为k项的数组
for(j=0;j<k;j++)
Arr2[j]=Arr1[j];//将Arr1赋给Arr1
sort(Arr2,k); //对Arr2从大到小进行排序
printf("得分\t排行\n");
for(j=0;j<k;j++)//在一个循环中对这两个数组进行比较
for(i=0;i<k;i++)
{
if(Arr1[j]==Arr2[i])//如果找到了相同的项
printf("%d\t:%d\n",Arr1[j],i+1);//输出Arr1中相应的项以及Arr2中相应的下标加1
}
return 0;
}
void sort(int *pArr,int len)//从大到小排序
{
int i,j,t;
for(i=0;i<len-1;i++)
{
for(j=0;j<len-1-i;j++)
{
if(pArr[j]<pArr[j+1])
{
t=pArr[j];
pArr[j]=pArr[j+1];
pArr[j+1]=t;
}
}
}
}
他用的是定长数组,我用了动态数组。
请大家提提意见。