我想找到数组中最大和第二大的数字。我可以找到最大的但第二大的却变成最大的,不知道为什么
int main()
{
int number[10];
cout<<"enter 10 numbers\n";
for (int i =0;i<=9;++i){
cin>>number[i];
}
int larger2=number[0],larger=number[0];
for(int a=0;a<=9;++a){
if(number[a]>larger) {
larger=number[a];
}
}
for(int b=0;b<=9;++b){
if( number[b]>larger2 && larger>larger2 ){
larger2=number[b];
}
}
cout<<"larger "<<larger<<endl;
cout<<"larger 2 "<<larger2<<endl;
return 0;
}
答案 0 :(得分:3)
我将修改您的第二个评估循环:
由于您至少在一次迭代中未正确分配large2,因此不应将其用于比较。 (即不要执行larger>larger2
)
for(int b=0;b<=9;++b){
if( number[b]>larger2 && larger>number[b]){
larger2=number[b];
}
}
答案 1 :(得分:1)
看看这个(只有在数组中至少有2个元素的情况下才有效,否则number[1]
会产生分段错误):
int main()
{
int number[10];
cout<<"enter 10 numbers\n";
for (int i =0;i<=9;++i){
cin>>number[i];
}
int larger2=min(number[0],number[1]) ,larger=max(number[1],number[0]);
for(int a=0;a<=9;++a){
if(number[a]>larger2) {
if(number[a]>larger1){
larger2=larger;
larger = number[a];
}
else larger2=number[a];
}
}
cout<<"larger "<<larger<<endl;
cout<<"larger 2 "<<larger2<<endl;
return 0;
}
解释是这样的:
larger
,最小的则分配给larger2
larger2
,我们需要将该值存储在larger
中,如果它更大,那么第二个更大的将是{{ 1}},否则我们需要将其存储在larger
就是这样。
还要考虑到该算法是O(n),因为我们只需要遍历整个数组一次,而不是原来的算法i O(n * 2),因为你必须遍历整个数组两次时间,因此,使用更大的数组大小,此操作将在大约一半的时间内结束