HUD 1465 想请问一下为什么这两个代码一个能过一个不能过

问题描述:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
    int a;

        long *p=(long *)malloc(20*sizeof(long));
        if(p==NULL) return 0;
        p[1]=0;
        p[2]=1;
        int i;
        for(i=3;i<=20;i++)
        {
            p[i]=(i-1)*(p[i-1]+p[i-2]);
        }
        while(scanf("%d",&a)!=-1)
            {printf("%lld\n",p[a]);
            }
        free(p);

    return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max 20
long long  p[max];
int main()
{
        int n;
        p[1]=0;
        p[2]=1;
        p[3]=2;
        int i;
        for(i=4;i<=20;i++)
        {
            p[i]=(i-1)*(p[i-1]+p[i-2]);
        }
        while(scanf("%d",&n)!=EOF)
            {printf("%lld\n",p[n]);
            }


    return 0;
}
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
        int a;
        long long *p=(long long *)malloc(sizeof(long long)*20);
        p[1]=0;
        p[2]=1;
        int i;
        for(i=3;i<=20;i++)
        {
            p[i]=(i-1)*(p[i-1]+p[i-2]);
        }
        while(scanf("%d",&a)!=EOF)
            {printf("%l64d\n",p[a]);
            }
        free(p);

    return 0;
}

只看代码的情况下,能找出两处根本的不同:
1. 第一份代码的数据类型为long,第二份代码的数据类型为long long,一般来说long的数据范围是2^31-1,long long的数据范围是2^63-1,数据范围不同。
2. while循环条件中scanf的返回值不可能是-1,要把-1改为0或EOF。

是第二份过了吧?