这些代码之间的区别在哪里?输出不应该一样吗?

时间:2019-03-28 03:48:15

标签: c++ onlinejudge

我已经为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

第一个密码(矿山)

#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;
    }
}

第二个密码(在线)

#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;
}

我的输出(对于第一个程序)

-444446533
1595456521
1292087056

在线输出(接受第二个程序)

16735422651
14480358409
5587054352

1 个答案:

答案 0 :(得分:3)

enviromentarea均为int,这大概意味着它们是32位值,可以存储-2,147,483,648到2,147,483,647(含)之间的值。

两个较大的值相乘可以超出此范围。例如,对2,147,483,647进行平方运算将得出一个值,该值需要存储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 longlong long来做到这一点,也可以将它们enviroment制成。 / p>

P.S。 thank-you拼写错误(它缺少 n :enviro n 项)。