我必须以相同的方式从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,648
到2,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
现在,由于a
和b
是整数,因此在将其分配回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/