#c #multiplication
#c #умножение
Вопрос:
A и B — целые числа в диапазоне от 1 до 10 ^ 9 , pairs — переменная, содержащая значение выражения ((A / 2)(B / 2) ((A-(A / 2))(B-(B / 2)))))
#include<iostream>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--)
{
long int A,B;
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;
}
Комментарии:
1.
(A/2)*(B/2)
Каждый фактор равен along
, поэтому произведение вычисляется как along
. Когда вы присваиваете его along long
в конце, становится слишком поздно, промежуточные вычисления уже переполнены. Чтобы избежать этого, вы могли бы определитьA, B
какlong long
или привести значения в выражении.
Ответ №1:
Во многих реализациях a long int
в C — это просто 32-разрядное число, максимальное значение равно 2 147 483 647 . Итак, если A равно 10 ^ 9, а b также равно 10 ^ 9, их произведение превышает максимальное значение 32-битного числа (на самом деле A и B могут быть намного меньше 10 ^ 9, так что их произведение превышает 2,15 миллиарда). Поэтому продукт переполнен. Как предложено в комментарии,
вы можете изменить определение A и B на long 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;
}