C++ 若我取A=10^9和B=10^9,那个么下面的代码将给出负输出。为什么?它为我提供了小整数的正确输出
A和B是介于1到10^9之间的整数, pairs是一个包含表达式((a/2)(B/2)+((a-(a/2))(B-(B/2))值的变量C++ 若我取A=10^9和B=10^9,那个么下面的代码将给出负输出。为什么?它为我提供了小整数的正确输出,c++,multiplication,C++,Multiplication,A和B是介于1到10^9之间的整数, pairs是一个包含表达式((a/2)(B/2)+((a-(a/2))(B-(B/2))值的变量 #包括 使用名称空间std; int main() { int T; cin>>T; 而(T--) { 长int A,B; cin>>A>>B; 在许多实现中,C++中的长INT/COD>只是32位数字,最大值是2147483647。因此,如果A是10 ^ 9和B也是10 ^ 9,它们的乘积超出32位数字的最大值(实际上A和B可以比10 ^ 9小得多,使得它们的
#包括
使用名称空间std;
int main()
{
int T;
cin>>T;
而(T--)
{
长int A,B;
cin>>A>>B;
在许多实现中,C++中的<代码>长INT/COD>只是32位数字,最大值是2147483647。因此,如果A是10 ^ 9和B也是10 ^ 9,它们的乘积超出32位数字的最大值(实际上A和B可以比10 ^ 9小得多,使得它们的产品超过21亿5000万)。.因此产品溢出。如评论中所述
您可以将A和B的定义更改为long int
#include<iostream>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
long long int A,B; // here
cin>>A>>B;
//cout<<A<<" "<<B<<endl;
long long int pairs = ((A/2)*(B/2)+((A-(A/2))*(B-(B/2))));
cout<<pairs<<"\n";
}
return 0;
}
#包括
使用名称空间std;
int main()
{
int T;
cin>>T;
而(T--)
{
long int A,B;//这里
cin>>A>>B;
//法院(A/2)*(B/2)
每个因子都是一个long
,因此产品被计算为long
。当您在末尾将其分配给long
时,为时已晚,中间计算已经溢出。为了避免这种情况,您可以将a、B
定义为long
,或者在表达式中强制转换值。
#include<iostream>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
long long int A,B; // here
cin>>A>>B;
//cout<<A<<" "<<B<<endl;
long long int pairs = ((A/2)*(B/2)+((A-(A/2))*(B-(B/2))));
cout<<pairs<<"\n";
}
return 0;
}