В чем разница между этими кодами? Разве вывод не должен быть одинаковым? - PullRequest
0 голосов
/ 28 марта 2019

Я написал программу (первую) для проблемы с OJ, но вывод был неверным.Затем в Интернете я нашел заданную вторую программу, которая выглядит почти как моя, но результат не тот!Может ли кто-нибудь помочь мне узнать, где я совершаю ошибку?Заранее спасибо.

Примечание. Я запустил обе программы в одном и том же компиляторе

Ввод был

3
5
51927 56551 48919
14433 22446 13324
85506 99376 63634
93997 63631 83866
41720 16645 16267
4
34401 73409 48126
80906 29491 46483
79890 23963 57954
67975 70273 65231
4
17044 82753 40300
30368 51031 96851
10353 81816 19296
94218 83673 18672

1-й код (Мой)

#include<iostream>
using namespace std;
int main()
{
    int n, f;

    cin>>n;
    while(n--)
    {
        cin>>f;
        long long total=0;

        int area;
        int animals, enviroment;

        for(int i=0;i<f;i++)
        {
            cin>>area>>animals>>enviroment;

            total+=enviroment*area;
        }
        cout<<total<<endl;
    }
}

2-й код (из онлайн)

#include<cstdio>

using namespace std;

int main(){    
    int T,f,a,b,c;
    long long sum;

    scanf("%d",&T);

    for(int i=0;i<T;i++){
        scanf("%d",&f);

        sum=0;

        for(int j=0;j<f;j++){
            scanf("%d %d %d",&a,&b,&c);
            sum+=(long long)a*c;
        }

        printf("%lld\n",sum);
    }

    return 0;
}

Мой вывод (для 1-й программы)

-444446533
1595456521
1292087056

Онлайн-вывод (из 2-й программы, которая принимается)

16735422651
14480358409
5587054352

1 Ответ

3 голосов
/ 28 марта 2019

enviroment и area оба равны int, что, вероятно, означает, что они являются 32-разрядными значениями, которые могут хранить значения в диапазоне от -2 147 483 648 до 2 147 483 647 (включительно).

Умножение двух больших значенийможет превышать этот диапазон.Например, возведение в квадрат 2147483647 приведет к значению, для хранения которого требуется более 32 бит.Превышение этого диапазона приводит к неопределенному поведению.

long long является (как минимум) 64-разрядным и может хранить значения в диапазоне от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807 (включительно).Он достаточно велик, чтобы содержать значение 2 147 483 647 в квадрате.

Таким образом, необходимо убедиться, что умножение выполняется с использованием переменных long long.Вы можете сделать это либо приведением enviroment и / или area к long long до умножения, либо вы можете просто сделать их long long.

PS enviromentнаписано с ошибкой (отсутствует n : enviro n ment).

...