C代码在ideone上运行良好,但在spoj中获得WA

C代码在ideone上运行良好,但在spoj中获得WA,c,C,在spoj中获得WA,在ideone上运行良好,用于测试用例。有什么想法吗? 早些时候我用java写的,是NZEC。这是用C写的 #include<stdio.h> int main(){ int n,i; scanf("%d",&n); long num[n]; for(i=0;i<n;i++){ scanf("%ld",&num[i]); } int flag; int l;

在spoj中获得WA,在ideone上运行良好,用于测试用例。有什么想法吗? 早些时候我用java写的,是NZEC。这是用C写的

#include<stdio.h>

int main(){

    int n,i;
    scanf("%d",&n);
    long num[n];
    for(i=0;i<n;i++){
        scanf("%ld",&num[i]);
    }

    int flag;
    int l;
    for(l=0;l<n;l++){
        if(num[l+1] > num[l]){
            flag = 1;
            break;
        }
        else if(num[l+1] < num[l]){
            flag = 0;
            break;
        }
    }
    int count = 1,k;

    for(k =0; k<n-1; k++){
        if(flag){
            if (num[k+1] > num[k]){
                count++;
                flag = 0;
            }
            else if(num[k+1]==num[k]){
                flag = 1;
            }
            else if(num[k+1]<num[k]){
                //count++;
                flag=1;
            }
        }
        else{
            if(num[k+1] < num[k]){
                count++;
                flag = 1;
            }
            else if(num[k+1]==num[k]){
                flag = 0;
            }
            else if(num[k+1]>num[k]){
                //count++;
                flag = 0;
            }
        }
    }

    printf("%d",count);
    return 0;
}
#包括
int main(){
int n,i;
scanf(“%d”和“&n”);
长数[n];

对于(i=0;i等等,这里有很多问题。 首先,这里有几个:

  int n,i;
  scanf("%d",&n);
  long num[n];
不可能(或者至少不可能)声明某个变量大小的数组,请通过这样做来使用:

long* num = malloc(sizeof(long)*n);
另一个问题是,您在第一个循环中跨越了数组的边界,这很奇怪,因为您在第二个循环中处理了它:p 只需将:
for(l=0;l
更改为
for(l=0;l
,就像在IF语句中使用数组l+1元素一样,当l为n-1时,实际上是测试n-1元素与第n个元素的比较,第n个元素不在数组的边界内。
除此之外,代码似乎还行。

这个问题与以下问题有很强的联系。通常会显示一个问题,用户需要提交代码,为测试输入提供预期的输出,并且是其中的一员。事实上,几乎所有问题都会显示示例输入和示例输出。因此,您的代码会给出相同的输出如中问题示例输入的示例输出中所示,但您的代码在在线判断中经过大量数据测试,这将导致NZEC。

不要假设每个人都知道“WA”和“NZEC”的含义。我当然不知道。迷你SPOJ词汇表:SPOJ:Sphere online judge(编程问题/谜题/竞赛网站),WA:回答错误,NZEC:非零退出代码,TLE:时间限制Exceeded@MichaelBurr:我建议将其编辑到问题中。不建议使用IMO
long
,因为它在Windows上是32位,在大多数Linux/Unix实现中是64位。C标准只指定long至少有32位,您无法知道
long
在法官的编译器中。假设它是64位可能会导致严重的溢出。如果你需要64位类型,你应该使用保证至少是64位的
long
,或者在
stdint.h
中使用
int64\u t
。请注意,如果我没有读到上面MichaelBurr的评论,我会认为WA是警告。不要假设e每个人都知道您所说的Dvla从C99开始就可用,但您必须明确指定
--std=C99
Lu'u-我知道,但它在原始版本中并不正确(在我的编译器中,您不需要指定--std=C99)我不确定哪个站点运行什么…是的,我的意思是如果你不确切知道编译器和编译标志,你不能假设任何事情。只使用保证的更好