两种基本相同的方法,代20测试时输出来的两者数据相同,代50测试时怎么输出来的数据不同?

//C语言

//1.
#include<stdio.h>
void main()
{
 double a[20000];
    int n,i;
    double sum=0,s;
    scanf("%d",&n);
    a[0]=2;
    a[1]=3;
    for(i=2;i<n;i++)
    {
     a[i]=a[i-1]+a[i-2];
    }
    for(i=0;i<n;i++)
    {
     if(i==0)
     {
      s=a[i]/(i+1);
     }
     else if(i>0)
     {
      s=a[i]/a[i-1];
     }
     sum=sum+s;
    }
    printf("%.2lf",sum);
}



//2.
#include<stdio.h>
void main()
{
 int a[20000];
    int n,i;
    double sum=0,s;
    scanf("%d",&n);
    a[0]=2;
    a[1]=3;
    for(i=2;i<n;i++)
    {
     a[i]=a[i-1]+a[i-2];
    }
    for(i=0;i<n;i++)
    {
     if(i==0)
     {
      s=1.0*a[i]/(i+1);
     }
     else if(i>0)
     {
      s=1.0*a[i]/a[i-1];
     }
     sum=sum+s;
    }
    printf("%.2lf",sum);
}

 

你要考虑int和double的范围,也就是一个最大值的问题,i超过最大值后就不能表示正确的数值了,可能会变成负数的(涉及补码的规则)