OJ上方差的题目 runtime error SIGSEGV 不知道为啥?求大神???

输入第一行是一个整数n表示数列中元素的个数,接下来输入元素a1,a2,...,an。1<=n<=500,0<=ai<=1000,n=0代表输入结束。输出精确到小数点第二位。
Sample Input
2
2 2
0

Sample Output
0.00

#include<cstdio>
#include<iomanip> 
using namespace std;
double ave(double a[],int n)
  {
    int sum=0,ave;
    for (int i=0;i<n;i++)
    sum+=a[i];
    ave=sum/n; 
    return ave;
   }
double variance (double a[],int n)
   {
   if(n!=0){
    double va;
    double average=ave(a,n);
    for (int i=0;i<n;i++)
    va=(a[i]-average)*(a[i]-average)/n;
    cout<<va;}
    return 0;
    }
int main(){
    int n;
    cin>>n;
    double a[n];
    while(n!=0)
    {
    for(int i=0;i<n;i++)   cin>>a[i];
    cin>>n;
    }
    cout<<fixed<<setprecision(2)<<variance(a,n);
return 0;
}

栈溢出了。应该是无限递归或递归层数太多导致的。

还有:如果要用cout,最好要加上 #include< iostream > 。