Spoj ROOTCIPH错误答案

时间:2014-03-05 13:55:07

标签: c

这是Spoj问题ROOTCIPH。 我用C语言解决了两种方法。一种方法给出了正确的答案而另一种给出了错误的答案。

我们不会讨论如何解决问题。解决方案很简单。它总是a * a -2 * b。 (根据三次方程的根来考虑..)无论如何,问题与它无关。我给出了这个细节,以便人们可以将他们的解决方案运行到源并分析更多。

现在的问题是:

在下面的代码中,如果不是'int',我需要很长时间,我的答案显示正确,否则'int'显示错误。我在printf中占用%lld,所以即使整数绑定超过它应该处理。

错误的代码:

int main()
{
    int  a,b,c;
    int t;

    scanf("%d",&t);

    while(t--)
    {
        scanf("%d%d%d",&a,&b,&c);
        printf("%lld\n",1LL*a*a-2*1LL*b);
    }

    return 0;
}

正确的代码:

int main()
{
    long long  a,b,c;
    int t;

    scanf("%d",&t);

    while(t--)
    {
        scanf("%lld%lld%lld",&a,&b,&c);
        printf("%lld\n",a*a-2*b);
    }

    return 0;
}

请注意,a,b,c的绝对值不会超过10 ^ 8。

第一种方法提供了错误的解决方案?您可以在给定的链接中运行解决方案并检查。

根据C operator precedence table*左右相关性。

2 个答案:

答案 0 :(得分:1)

正如@GIJoe所建议的那样,使用long long来保存比int更大的数字,可能就是差异。例如,表达式的一部分是a*a;即使你将它乘以1LL,实际上转换它,也可能已经造成了损害。

答案 1 :(得分:0)

如果你的答案不在[-2 147 483 648; 2 147 483 647],然后它不能装入一个int,它以32位存储(如果你在16位系统上则为16,所以在[-32 768; 32 767]中)。

长整数存储在64位,无论您的系统如何。