数组C ++问题中的最大和第二大数字

时间:2019-11-17 21:53:18

标签: c++

我想找到数组中最大和第二大的数字。我可以找到最大的但第二大的却变成最大的,不知道为什么


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;
}

2 个答案:

答案 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;
}

解释是这样的:

  1. 从前两个数字中取最大,然后分配给larger,最小的则分配给larger2
  2. 循环遍历数组,如果当前数字大于larger2,我们需要将该值存储在larger中,如果它更大,那么第二个更大的将是{{ 1}},否则我们需要将其存储在larger

就是这样。

还要考虑到该算法是O(n),因为我们只需要遍历整个数组一次,而不是原来的算法i O(n * 2),因为你必须遍历整个数组两次时间,因此,使用更大的数组大小,此操作将在大约一半的时间内结束