1010 一元多項式求導 (25 分)

1010 一元多項式求導 (25 分)

設計函數求一元多項式的導數。(注:xn(n爲整數)的一階導數爲nxn−1。)ios

輸入格式:

以指數遞降方式輸入多項式非零項係數和指數(絕對值均爲不超過 1000 的整數)。數字間以空格分隔。數組

輸出格式:

以與輸入相同的格式輸出導數多項式非零項的係數和指數。數字間以空格分隔,但結尾不能有多餘空格。注意「零多項式」的指數和係數都是 0,可是表示爲 0 0ide

輸入樣例:

3 4 -5 2 6 1 -2 0

輸出樣例:

12 3 -10 1 6 0

思路

  1. 開一個數組a[],用來存放對應指數的係數,例如a[e]就是指數爲e的項的係數。
  2. 而後使用while.. EOF的格式來讀入係數和指數,具體見配套用書2.10.2節。
  3. 從低次項至高次項進行枚舉(不能反過來),經過求導公式修改數組a的元素,同時計數不爲零的導數項的個數。
  4. 最後從高次項到低次項進行枚舉,輸出非零項的係數和指數。
  5. 注意點
    1. 經測試,該題的指數都是非負整數,不存在負指數的狀況。
    2. 對零次項的求導須要特判其直接爲0。
    3. 在求導後,當前係數必須清空爲0,不然可能後面沒法被覆蓋。
    4. 求導部分必須從低次項枚舉到高次項,不然結果爲出錯。關於這點,不妨本身動手模
      擬一下從高次到低次進行枚舉的過程。
    5. 若是求導以後沒有任何非零項,須要輸出00, 這是本題的一個「陷阱」

參考答案

#include<stdio.h>
int main(){
	int a[1010] = {0};
	int k, e, count = 0;
	while(scanf("%d%d", &k, &e) != EOF){
		a[e] = k;
	}
	a[0] = 0;//指數爲0的就是常數項,常數項求導直接爲0
	for(int i = 1; i<=1000;i++){//從一次項開始枚舉 
		a[i-1] = a[i] * i;//求導公式
		a[i] = 0;//在求導以後,當前係數必須清空爲0,不然後面可能沒法被覆蓋,因此這句不能省
		if(a[i-1] != 0) count ++;//count計數不爲0的導數項的個數
	}
	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;
}

思路(柳婼大佬)

分析:函數

  1. flag⽤來判斷是否已經有過輸出~
  2. 當b!=0時,由於給出的是全部⾮零項係數,因此一定會有輸出,先判斷flag是否爲1,若是爲1表示已 經有過輸出,那麼在前⾯要先輸出⼀個空格
  3. 輸出 a * b (求導後的係數)和 b – 1(求導後的指數),而後將flag標記爲1表示已經有過輸出 4.最後判斷當沒有輸出而且b==0的時候, 輸出「0 0」

參考代碼

#include<iostream>
using namespace std;
int main(){
	int a, b, falg = 0;
    while(cin >> a >> b){
        if(b  != 0){//若是b==0那麼就不會進入這個循環,即只有常數項係數,那麼falg就不會爲1
			if(flag == 1) cout << "";
            cout << a * b << " " << b - 1;
            falg = 1;
        }
    }
    if(falg == 0) cout << "0 0";
}
相關文章
相關標籤/搜索