PTA基礎編程題目集(一)(pow函數用法,7-13 日K蠟燭圖、7-18 二分法求多項式單根(*))

7-13 日K蠟燭圖 (15 分)

https://pintia.cn/problem-sets/14/problems/793

AC代碼:

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <algorithm>
 4 using namespace std;
 5 int main()
 6 {
 7     double open,high,low,close;
 8     scanf("%lf %lf %lf %lf",&open,&high,&low,&close);
 9     if(open>close) printf("BW-Solid");
10     else if(open==close) printf("R-Cross");
11     else printf("R-Hollow");
12     if((high>open&&high>close)&&(low<open&&low<close)) printf(" with Lower Shadow and Upper Shadow\n");
13     else if(high>open&&high>close) printf(" with Upper Shadow\n");
14     else if(low<close&&low<open) printf(" with Lower Shadow\n");
15     return 0;
16  }

 7-18 二分法求多項式單根 (20 分)

 https://pintia.cn/problem-sets/14/problems/798

AC代碼:

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <algorithm>
 5 using namespace std;
 6 double fal(double a3,double a2,double a1,double a0,double x)
 7 {
 8     double value=a3*x*x*x+a2*x*x+a1*x+a0;
 9     return value; 
10 }
11 int main()
12 {
13     double a3,a2,a1,a0,x;
14     double low,high,mid;
15     double threshold=0.001;
16     double value1,value2,value3;
17     scanf("%lf %lf %lf %lf",&a3,&a2,&a1,&a0);
18     scanf("%lf %lf",&low,&high);
19     while(high-low>=threshold)
20     {
21         value1=fal(a3,a2,a1,a0,low);
22         value2=fal(a3,a2,a1,a0,high);
23         if(value1*value2==0){
24             if(value1==0){
25                 printf("%.2f\n",low);
26                 break;
27             }
28             else if(value2==0)
29             {
30                 printf("%.2f\n",high);
31                 break;
32             }
33         }
34         else{
35             if(value1*value2<0)
36             {
37                 mid=(high+low)/2;
38                 value3=fal(a3,a2,a1,a0,mid);
39                 if(value3==0)
40                 {
41                     printf("%.2f\n",mid);
42                     break;
43                 }
44                 else if(value1*value3<0) high=mid;
45                 else if(value2*value3<0) low=mid; 
46             }
47             else if(value1*value2>0) break;
48         }
49     }
50     if(high-low<threshold){
51        // if(fal(a3,a2,a1,a0,low)==0) printf("%.2lf\n",low);
52         //else if(fal(a3,a2,a1,a0,high)==0) printf("%.2lf\n",high);
53         printf("%.2f\n",(low+high)/2);
54     }
55     return 0;
56 }

我日,這題卡了我好久,前面幾次提交都是部分正確,沒有考慮當端點函數值爲0的情況,後來在while循環中加了個條件判斷,再提交竟然沒答案輸出,然後我在想是不是double類型輸入輸出格式問題,改了還是答案不輸出,提交報WA,然後我調試一下,發現value1和value2值根本就不對,說明程序一開始求函數值就錯了,然後我就沒用pow函數,而是直接讓pow(x,3)表示成x*x*x,再輸出,居然AC。提交也滿分了,然後上網百度pow函數的用法,這是我搜到的:

如果底數 x 爲負數並且指數 y 不是整數,將會導致 domain error 錯誤。
如果底數 x 和指數 y 都是 0,可能會導致 domain error 錯誤,也可能沒有;這跟庫的實現有關。
如果底數 x 是 0,指數 y 是負數,可能會導致 domain error 或 pole error 錯誤,也可能沒有;這跟庫的實現有關。
如果返回值 ret 太大或者太小,將會導致 range error 錯誤

  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章