1010 一元多項式求導 (25 分)
思路:可用陣列實現,每兩個為一對,用a[i]表示係數,a[i+1]表示對應的指數,a[i]=a[i]*a[i+1],a[i+1]=a[i+1]-1;
程式碼如下:
#include<iostream> using namespace std; int main() { int a[10000],i=0,j=1,n=0; char c; while(c!='\n') { cin>>a[n]; n++; c=getchar(); } for(i=0;i<n-1;i+=2) { a[i]=a[i]*a[i+1]; a[i+1]=a[i+1]-1; } for(i=0;i<n-1;i+=2,j+=2) { if((a[0]==0)&&(a[1]==-1)){ cout<<"0 0"; break; } else { if((a[i+2]!=0)&&(a[j+2]!=-1)) { cout<<a[i]<<" "<<a[j]<<" "; } else { cout<<a[i]<<" "<<a[j]; break; } } } return 0; }
注意:一定注意輸出格式啊!!!真的有毒,pat測試用例不公開,我第一次提交的時候有一個測試用例不通過,25分只能拿22分,一直猜不到到底哪裡出問題,debug了一下才發現類似這樣的用例:5 3 0 0通不過,最開始的時候並沒有考慮到這種輸入,以為0 0只會作為零多項式的形式輸入,出現兩個0為一組的情況我在最開始就直接把它判斷為零多項式的輸出了,所以導致最後輸出的值一直都是15 2 0 0;正確答案是15 2;之前真的沒想到還能有這種輸入,我自己測試的時候,指數為0的式子,係數也會有值的,就沒考慮到這種,細節決定成敗,確實如此。
#include <iostream> using namespace std; int main() { int a, b, flag = 0; while (cin >> a >> b) { if (b != 0) { if (flag == 1) cout << " "; cout << a * b << " " << b - 1; flag = 1; } } if (flag == 0) cout << "0 0"; return 0; }
大神的思路:
分析:1.flag用來判斷是否已經有過輸出~
2.當b!=0時,因為給出的是所有非零項係數,所以必定會有輸出,先判斷flag是否為1,如果為1表示已經有過輸出,那麼在前面要先輸出一個空格
3.輸出 a * b 和 b – 1,然後將flag標記為1表示已經有過輸出
4.最後判斷當沒有輸出並且b==0的時候,輸出“0 0”
本渣渣的感想:大神的程式碼還是一如既往地簡單呢(*^▽^*),莫名想哭,這題用陣列解還是太麻煩了,指數和係數是一對沒錯,但其實可以在輸入的時候判斷:a為係數,b為指數,flag為判斷是否輸出過的標誌,直接簡單粗暴地判斷b是否為0,不為0的時候輸出求導之後的值,其中這個flag的作用真的很大,不用寫過多的判斷語句來判斷此時空格是否應該輸入,只需要一個flag引數就可以完成:迴圈內部,最初b!=0,flag==0的話,首先輸出的是a*b空格b-1,注意此時b-1後面是沒有空格的,此時已經有輸入了,flag變成1; 如果再進行迴圈,滿足b!=0條件,此時flag==1,就在上一個b-1的後面加空格;如果flag==1,b=0的話,就不會再進行求導了,最後的那個數字也不會再加空格。然後再是對零多項式的判斷:如果flag==0的話,就證明之前沒有過輸出,直接輸出0 0,如果flag!=0的話,代表有過輸出了,就不是零多項式,這樣的寫法也不會造成像我之前一樣犯的錯誤,將5 3 0 0這樣的式子的輸出弄錯。好贊啊~學習到了
今天也要繼續加油鴨!
今天吃了一個烤雞腿獎勵自己,嗚嗚嗚嗚太好吃了!