C中全局变量和局部变量之间的差异

时间:2014-04-14 16:41:32

标签: c pascal

我在codechef.com上遇到了一个问题。

当我在全局声明中提交包含所有变量(只有3个)的代码时,我得到了Accepted,但是当我在main函数中移动所有3个变量时,我得到了错误的答案!! 所有3个变量都是长long类型,IO使用的是scanf& printf的。

long long P, Q, a; scanf("%d %d",&P,&Q); printf("%lld",a);

我尝试在pascal中翻译相同的代码,然后我得到时间限制超过。

另外一件事,当我使用自定义快速IO功能时,我的时间限制超出了。

在所有情况下,我的代码都能正常工作,并在我的IDE中生成正确的输出。

当我使用全局变量而不写'&34;返回0"声明虽然被接受了。 但是如果我在main函数中声明变量而不写'&34;返回0"声明,它坚持非零返回代码运行时错误。

任何人都可以告诉我为什么我无法在本地变量声明的情况下接受我的代码,或者为什么我在Pascal中使用精确算法时会超出时间限制?输入有什么问题吗?

这是我的C代码,它被codechef接受:

#include<stdio.h>
long long P,Q,a;
int main()
{
    scanf("%d %d",&P,&Q);
    //read(Q);
    while (P>0 || Q>0 )
    {
        a = (  Q * ( 3*P - 2*(Q*Q-1) )  ) / 3;
        printf("%lld\n",a);
        scanf("%d %d",&P,&Q);
    }
    return 0;
}

这是时间限制超过的pascal代码:

program ex2dimarray;
var
   P,Q,a: Cardinal;
begin
     readln(P,Q);
     //read(Q);
     while (P>0) or (Q>0) do
     begin
          a := (  Q * ( 3*P - 2*(Q*Q-1) )  ) DIV 3;
          writeln(a);  
          readln(P,Q);
          //read(Q);
     end;
end.

程序终止条件是P和Q都是0.

1 个答案:

答案 0 :(得分:1)

对于C代码,您的问题在于您的scanf。在写入long long int时使用%d而不是%lld会导致只取一个int并将其存储到long long int中。对于具有小输入的全局变量,这并不重要,因为全局变量被初始化为0.但是当你将它们放在main中时,scanf未写入的高位字节可能包含一些随机数据,这将导致计算不可预测