题目
我们定义如下矩阵:
1/1 1/2 1/3
1/2 1/1 1/2
1/3 1/2 1/1
矩阵对角线上的元素始终是1/1,对角线两边分数的分母逐个递增。
请求出这个矩阵的总和。
Input
输入包含多组测试数据。每行给定整数N(N<50000),表示矩阵为N*N。当N=0时,输入结束。
Output
输出答案,结果保留2位小数。
思路
1.Time Limit Exceed 50
- 计算每次矩阵的数,并且打表
- 通过n-1的矩阵值推导求出n的矩阵值
- 最后得到结果
代码:
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
vector<double> save;
double count(int n){
if(n==1){
if(save.size()<n)
save.push_back(1);
return 1;
}
else{
double res=0;
if(save.size()>=n)
res=save[n-1];
else{
double sum=0;
for(int i=2;i<=n;i++){
sum+=1/(double)i;
}
res=count(n-1)+2*sum+1;
save.push_back(res);
}
return res;
}
}
int main(){
int n=0;
while(scanf("%d",&n)!=EOF){
if(n==0)
break;
double res=count(n);
printf("%.2lf\n",res);
}
return 0;
}
2.Accepted100
- 1/1
计算:1
1/1 1/2
1/2 1/1
计算:[(2*1+1*1/2)-2*1]2+21
1/1 1/2 1/3
1/2 1/1 1/2
1/3 1/2 1/1
计算:[(3*1+2*1/2+1*1/3)-3*1]*2+3*1
思路
- 先计算上三角(不算对角线)
- 再x2(因为有上下两个矩阵三角)
- 最后加上对角线
代码:
#include <stdio.h>
#include <iostream>
using namespace std;
int main(){
int n=0;
while(scanf("%d",&n)!=EOF){
if(n==0)
break;
double res=0;
for(int i=0;i<n;i++)
res+=(n-i)*1.0/(1.0+i);
res-=n;
res*=2;
res+=n;
printf("%.2lf\n",res);
}
return 0;
}