我必须以相同的方式从5个数组中找到4个数字的最大和。由于某些原因,maxsum变为负数,因此我的代码因某些较大的测试用例而失败

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;

int minimini(int list[]){
    int minisum=0;
    int taker;
    int a=max({list[0],list[1],list[2],list[3],list[4]});
    for (int i=0; i<5; i++){
        taker=list[i];
        if(taker!=a){
            minisum=minisum+taker;
        }
    }
return minisum;
}
int maxa(int list[]){
    int maxsum=0;
    int taker;
    int a=min({list[0],list[1],list[2],list[3],list[4]});
    for (int i=0; i<5; i++){
        taker=list[i];
        if(taker!=a){
            maxsum=maxsum+taker;
            cout<<"maxsum >>"<<maxsum;
            cout<<"a="<<a;
        }
    }
return maxsum;
}
int main(){
    int list[5];
    int minisum, maxsum;
    for (int i=0; i<5; i++){
        cin>>list[i];
    }

    minisum=minimini(list);
    maxsum=maxa(list);

    cout<<minisum<<" "<<maxsum;


    return 0;
}

最佳答案

您的代码患有Integer Overflow。大多数现代计算机中的整数范围从-2,147,483,6482,147,483,647。既然您在注释中提到输入的范围可以从1到10 ^ 9,并且数组的大小为5,则最大和可以为5 * 10^9,实际上大于2,147,483,647。您只需要一个可以容纳更大值的数据类型,请使用:

  • long long
  • std::int64_t

  • 请注意,即使unsigned int也不会执行此操作,因为它是4,294,967,295 <5 * 10^9。另一件事是

    A. int a = 2,147,483,647 ; int b = 2,147,483,647 ; long long k = a + b现在,由于ab是整数,因此在将其分配回long long之前会发生溢出,因为会发生整数加法又称为32 bit加法。

    B. long long a = 2,147,483,647; long long b = 2,147,483,647; long long k = a + b。现在,不会发生溢出,因为将在long long上执行加法,因为a和b是long long,并且64 bit会进行加法

    代码如下所示:
    long long list[5]; //See int is now long long
    long long minisum, maxsum;
    
    for (int i=0; i<5; i++) //i can be int because it's size of list i.e 5
    {
        cin>>list[i];
    }
    
    minisum=minimini(list);
    maxsum=maxa(list);
    
    cout<<minisum<<" "<<maxsum;
    

    关于c++ - 我必须从5的数组中找到4个数字的最大和。我的代码对于更大的数字失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59640434/

    10-10 03:11