1. 程式人生 > 其它 >PAT B1010 一元多項式求導 (25分)

PAT B1010 一元多項式求導 (25分)

技術標籤:PAT記錄c語言資料結構

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代表輸入流結束就夠了。

(另外順便說一句printf也是有返回值的,代表的是正確輸出的字元數)

上面的程式碼中可以看到,在解決 “輸出結尾不能有多餘的空格” 時候,我想複雜了,使用了兩個迴圈,第一個是為了找出結果是否有非零項,第二個是為了輸出剩下的項數。這樣做也可以達到效果,但是不夠簡潔。下面是演算法筆記中採用的方法,其中使用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;
}

總的來說還是不斷思考一道題,不要看到就開始打程式碼,有了思路在腦海中整理一下,有必要的時候在草稿紙上模擬一下,看有沒有問題,或者能改進的地方,再開始實施。