2020-12-09
阿新 • • 發佈:2020-12-10
大一新生周訓練賽
題目描述:
Given an integer n, we only want to know the sum of 1/k2 where k from 1 to n.
Input
There are multiple cases.
For each test case, there is a single line, containing a single positive integer n.
The input file is at most 1M.
Output
The required sum, rounded to the fifth digits after the decimal point.
Sample Input
1
2
4
8
15
Sample Output
1.00000
1.25000
1.42361
1.52742
1.58044
題意:給你一個整數,我們想知道從1至n的1/n^2的和,結果保留五位小數。
解題思路:
可以知道當數一定大時,結果將不變,可以通過打表法尋找這個值的大致區域,但也不宜過大,過大同樣會超時。
如下錯誤程式碼1:
#include<stdio.h>
#include<math.h>
int main()
{
int n;
while(~scanf("%d",&n))
{
double sum= 0;
if(n<=65535)
{
for(int i=1;i<=n;i++)
{
sum=sum+1.0/(i*i);
}
printf("%.5lf\n",sum);
}
else if(n>65535)
printf("1.64483\n");
}
}
錯誤原因:結果不變值尋找錯誤,導致結果錯誤。
錯誤程式碼二:
```c
#include<stdio.h>
#include<math.h>
int main()
{
double n;
while(~scanf("%lf",&n))
{
double sum=0.0;
if(n<=1000000)
{
for(double i=1;i<=n;i++)
{
sum+=1.0/(i*i);
}
printf("%.5lf\n",sum);
}
else if(n>1000000)
printf("1.64493\n");
}
}
錯誤原因:結果不變值太大,導致運算超時。
AC程式碼:
```cpp
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
double n;
while(~scanf("%lf",&n))
{
if(n<=200000)
{
double sum=0;
for(double i=1;i<=n;i++)
{
sum=sum+1.0/(i*i);
}
printf("%.5lf\n",sum);
}
else if(n>200000)
printf("1.64493\n");
}
}
拓展總結:當運算資料過大且沒有找到更好的演算法時,可已通過尋找臨界值縮小計算範圍,從而避免超時。