если я беру A = 10 ^ 9 и B = 10 ^ 9, то следующий код дает отрицательный результат. почему? Это дает мне правильный вывод для небольших целых чисел

#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) Каждый фактор равен a long , поэтому произведение вычисляется как a long . Когда вы присваиваете его a long 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;
}