我们定义如下矩阵:
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位小数。
Sample Input
1
2
3
4
0
Sample Output
1.00
3.00
5.67
8.83
思路一(Time Limit Exceeded)
#include <stdio.h>
int main()
{
int n;
while (~scanf("%d", &n) && n)
{
int i, j, k;
double total = 0;
for (i = 1; i <= n; i++)
{
double sum = 0;
for (j = i, k = 1; j <= n; j++, k++)
{
sum += 1.0 / k;
}
//第i行加上第i列减1(每次多加一次 1)
sum = 2 * sum - 1;
total += sum;
}
printf("%.2lf\n", total);
}
return 0;
}
思路二(优化)
#include <stdio.h>
int main()
{
int i, n;
while (~scanf("%d", &n) && n)
{
double sum = 0;
//根据对称性,有n个1 和 2*(n-i+1)个i,(i>1)数相加
for (i = 2; i <= n; i++)
{
sum += 2.0 * (n - i + 1) / i;
}
printf("%.2lf\n", sum + n);
}
return 0;
}