【发布时间】:2014-03-05 13:55:06
【问题描述】:
这是 Spoj 问题ROOTCIPH。 我在 C 中通过 2 种方法解决了它。一种方法给出正确答案,另一种方法错误。
我们不会讨论如何解决问题。解决方案很简单。它总是 a*a -2*b。 (考虑三次方程的根......)无论如何,这个问题与它无关。我提供了这个细节,以便人们可以将他们的解决方案运行到源代码并进行更多分析。
现在的问题:
在下面的代码中,如果我用了 long long 而不是 '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 ,* 具有从左到右的关联性。
【问题讨论】:
-
是否有很大的数字不适合
int而适合long? -
我用过 1LL ,所以按照优先顺序,得到的答案应该总是 long long
-
结果将是
long long;这没有说明中间值的类型(特别是 a*a)。 -
如果将错误代码中的 printf 表达式替换为 (1LLa)*a-2*(1LLb) 会怎样?
标签: c