HDU 2156(法則を探す)
1888 ワード
ぶんすうマトリクス
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3321 Accepted Submission(s): 1985
Problem Description
行列を定義します.
1/1 1/2 1/3
1/2 1/1 1/2
1/3 1/2 1/1
行列対角線上の要素は常に1/1であり,対角線の両側の点数の分母は1つずつ増加する.
この行列の合計を要求する.
Input
行ごとに与えられた整数N(N<50000)は、行列がN*Nであることを示し、Nが0であると入力が終了する.
Output
答えを出力し、2桁の小数を保持します.
Sample Input
Sample Output
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3321 Accepted Submission(s): 1985
Problem Description
行列を定義します.
1/1 1/2 1/3
1/2 1/1 1/2
1/3 1/2 1/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
, !
/*
#include<iostream>
#include<cstdio>
using namespace std;
double calculate(int n)
{
int i,j;
double sum=0;
for(i=1;i<=n/2;i++)
{
sum+=1;
for(j=i-1;j>=1;j--)
{
sum+=1.0/((j+1)*1.0);
}
for(j=i+1;j<=n;j++)
{
sum+=1.0/((j-i+1)*1.0);
}
}
sum*=2;
if(n%2)
{
sum+=1;
for(j=1;j<=n/2;j++)
{
sum+=2*1.0/((j+1)*1.0);
}
}
return sum;
}
int main()
{
int n;
while(~scanf("%d",&n)&&n)
{
printf("%.02lf
",calculate(n));
}
return 0;
}
*/
#include<cstdio>
#define max 50000+10
double ans[max]={0,1};
int main()
{
int n,i;
double sum=1;
for(i=2;i<max;i++)
{
sum+=2*(1.0/i);
ans[i]=ans[i-1]+sum;
}
while(scanf("%d",&n)&& n)
{
printf("%.2lf
",ans[n]);
}
return 0;
}