这是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,*
左右相关性。
答案 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位,无论您的系统如何。