问题描述 :
一维数组中存储不超过100个整型数据,请找出其中第二大的元素,输出这些元素的值以及它们的下标。
注意,由于元素值可能相同,因此具有最大值的元素个数可能不只一个,第二大的元素是比它们小的那些元素。
输入说明 :
用户可输入多组数据,每组数据由两行组成:
第一行:数组元素的个数n
第二行:n个数组元素,由空格分隔
输出说明 :
对于每组输入,输出一行,包含第二大的元素的值以及它们的下标(都是整数),整数之间以空格分隔。如果有多个下标,则下标按从小到大的顺序输出。每行的开头与结尾无多余空格。
每组输出占一行。
如果不存在第二大的元素,则输出"none"(不包含引号)
好吧,我承认这道题我做了好大一会儿,不就求个老二吗,下标是刚开始输入时的下标位置,最后选择直接再开辟个数组吧
#include<stdio.h>
#include<stdlib.h>
//排序,我喜欢的直接排序
void sort(int a[],int n){
int *p;
int i,j,key;
p=a;
for(i=1;i<n;i++){
if(a[i-1]<a[i]){
key=a[i];
for(j=i-1;j>=0 && key>a[j];j--){
a[j+1]=a[j];
}
a[j+1]=key;
}
}
}
int main(){
int *a,*b,i,n,j,k,max;
while(scanf("%d",&n)!=EOF){
a=(int *)malloc(sizeof(int)*n);
b=(int *)malloc(sizeof(int)*n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(a,n);
max=0;
for(i=0;i<n;i++){
if(a[i]!=a[max]){
k=a[i];//找到啦,这就是老二的值
printf("%d",k);
break;
}
}
if(i>=n)
printf("none");
else{ //看看等于老二的位置都在那里,遍历一下原数组
for(i=0;i<n;i++){
if(b[i]==k)
printf(" %d",i);
}
}
printf("\n");
}
return 0;
}