描述
我们定义如下矩阵:
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开始变成了负数)。请问我的错误之处在哪里?