1. 程式人生 > 其它 >2020-12-09

2020-12-09

大一新生周訓練賽
題目描述:
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"); } }

拓展總結:當運算資料過大且沒有找到更好的演算法時,可已通過尋找臨界值縮小計算範圍,從而避免超時。