PAT B1010 一元多項式求導 (25分)
阿新 • • 發佈:2021-01-14
PAT B1010 一元多項式求導 (25分)
設計函式求一元多項式的導數。
輸入格式:
以指數遞降方式輸入多項式非零項係數和指數(絕對值均為不超過 1000 的整數)。數字間以空格分隔。
輸出格式:
以與輸入相同的格式輸出導數多項式非零項的係數和指數。數字間以空格分隔,但結尾不能有多餘空格。注意“零多項式”的指數和係數都是 0,但是表示為 0 0。
輸入樣例:
3 4 -5 2 6 1 -2 0
輸出樣例:
12 3 -10 1 6 0
以下是AC的程式碼:
#include<cstdio>
#define maxn 1010
int ans[maxn]={0};
int main(void){
int tcon,texp;
int count=0;
int i;
while(scanf("%d %d",&tcon,&texp) !=EOF){
ans[texp]=tcon;
}
ans[0]=0;
for(i=0;i<maxn-1;i++){
ans[i]=ans[i+1]*(i+1);
}
for(i=maxn;i>0;i--){
if(ans[i] != 0){
printf("%d %d",ans[i],i);
count++;
break;
}
}
for(int j=i-1;j>=0;j--){
if(ans[j] != 0){
printf(" %d %d",ans[j],j);
}
}
if(!count) printf("0 0");
return 0;
}
思路:
這道題關鍵點在於要知道scanf函式是有返回值的,一共分成三種情況:
1,代表正確輸入值的個數,比如scanf("%d%d",&c,&e),如果函式得到了正確輸入的兩個值,scanf會返回2,代表正確輸入的值個數;
2,0表示沒有得到正確輸入;
3,EOF,表示輸入流結束,這個在演算法筆記的第二章裡有詳細的講解,但是一般知道EOF代表輸入流結束就夠了。
上面的程式碼中可以看到,在解決 “輸出結尾不能有多餘的空格” 時候,我想複雜了,使用了兩個迴圈,第一個是為了找出結果是否有非零項,第二個是為了輸出剩下的項數。這樣做也可以達到效果,但是不夠簡潔。下面是演算法筆記中採用的方法,其中使用count來計算是否到最後一個非零項,以確定是否輸出結尾的空格。
#include<cstdio>
int main(void){
int a[1010]={0};
int k,e,count=0;
while(scanf("%d%d",&k,&e)!=EOF){
a[e]=k;
}
a[0]=0;
for(int i=1;i<=1000;i++){
a[i-1]=a[i]*i;
a[i]=0;
if(a[i-1] != 0)count++;
}
if(count==0)printf("0 0");
else{
for(int i=1000;i>=0;i--){
if(a[i] !=0){
printf("%d %d",a[i],i);
count--;
if(count!= 0)printf(" ");
}
}
}
return 0;
}
總的來說還是不斷思考一道題,不要看到就開始打程式碼,有了思路在腦海中整理一下,有必要的時候在草稿紙上模擬一下,看有沒有問題,或者能改進的地方,再開始實施。