HDU2156 分数矩阵 请问我的代码错在哪里?

描述
我们定义如下矩阵:
1/1 1/2 1/3
1/2 1/1 1/2
1/3 1/2 1/1
矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增。
请求出这个矩阵的总和。
输入
输入包含多组测试数据。每行给定整数N(N<50000),表示矩阵为N*N。当N=0时,输入结束。
输出
输出答案,结果保留2位小数。
样例输入
1
2
3
4
0
样例输出
1.00
3.00
5.67
8.83

以下是我的代码:

#include<iostream>
#include<cstdio>
#define printf __mingw_printf//加了这个是因为我的编译器long double会出错

using namespace std;

struct ftraction{
    long long up,down;
};

int main(){
    int n;
    while(scanf("%d",&n)!=EOF&&n!=0){
        int i;
        struct ftraction sum={0,1};
        for(i=n;i>0;i--){
            if(i==n){
               sum.up+=n;
            }else{
                struct ftraction temp={i*2,n-i+1};
                sum.up=sum.up*temp.down+temp.up*sum.down;
                sum.down*=temp.down;
            }
        }

        printf("%.2Lf\n",(long double)sum.up/(long double)sum.down);
    }
    return 0;
}


过问题给的样例是可以的,但是我发现当我输入的n逐渐变大之后,输出就会出错(从n=19开始变成了负数)。请问我的错误之处在哪里?

sum.up=sum.up*temp.down+temp.up*sum.down;
这行在连续相乘的情况下会溢出,修改很简单啊,把
struct ftraction{
    long long up,down;
}
改成
struct ftraction{
    long double up,down;
}
就好了啊,为啥非得用long long