洛谷P1067 [NOIP2009 普及組] 多項式輸出

Tomorrowland_D發表於2024-07-28

題目連結:- P1067 [NOIP2009 普及組] 多項式輸出

題目敘述:

[NOIP2009 普及組] 多項式輸出

題目描述

一元 n 次多項式可用如下的表示式表示:

  1. 多項式中自變數為 x,從左到右按照次數遞減順序給出多項式。

  2. 多項式中只包含係數不為 0 的項。

  3. 如果多項式 n 次項係數為正,則多項式開頭不出 + 號,如果多項式 n 次項係數為負,則多項式以 - 號開頭。

  4. 對於不是最高次的項,以 + 號或者 - 號連線此項與前一項,分別表示此項係數為正或者係數為負。緊跟一個正整數,表示此項係數的絕對值(如果一個高於 0 次的項,其係數的絕對值為 1,則無需輸出 1)。如果 x 的指數大於 1,則接下來緊跟的指數部分的形式為“x^b”,其中 b 為 x 的指數;如果 x 的指數為 1,則接下來緊跟的指數部分形式為 x;如果 x 的指數為 0,則僅需輸出係數即可。

  5. 多項式中,多項式的開頭、結尾不含多餘的空格。

輸入格式

輸入共有 2 行

第一行 1 個整數,n,表示一元多項式的次數。

第二行有 n+1 個整數,其中第 i 個整數表示第 n-i+1 次項的係數,每兩個整數之間用空格隔開。

輸出格式

輸出共 1 行,按題目所述格式輸出多項式。

樣例 #1

樣例輸入 #1

5 
100 -1 1 -3 0 10

樣例輸出 #1

100x^5-x^4+x^3-3x^2+10

樣例 #2

樣例輸入 #2

3 
-50 0 0 1

樣例輸出 #2

-50x^3+1

提示

NOIP 2009 普及組 第一題

對於100%資料, 0<=n<=100, -100<= 係數<=100;

思路:

這題乍一看要分很多種情況,是不是第一位數字?,有沒有符號?要不要輸出指數上的那個數字?如果我們從這些角度出發的話,這道題就複雜無比,要細分很多種情況,我們不妨從結果的輸出觀察

結果的輸出包括:

  1. 符號(如果係數不是負數的話,就得輸出'+'(除掉第一項外),如果係數是負數的話,就看需不需要單獨輸出"-",係數是除-1以外的數字,我們就不用輸出'-',否則要輸出'-')
  2. 係數(只要係數不為正負1,或者後面x的指數為0,我們就得輸出這個係數,不過正負1還得特殊處理一下)
  3. x的指數(如果為1,我們就輸出'x',否則輸出"x^i",i為指數,x的指數為0 ,我們就直接輸出係數,所以說這裡的係數為-1的情況需要特殊處理一下)

步驟講解:

我們觀察到,這個x的指數是從n一直遞減到0的,如果輸入的係數為0時,就不做任何處理,所以我們可以邊輸入邊處理,如果輸入的係數為0,就直接進入下一輪迴圈

  1. 首先,我們要先處理係數輸出的問題,什麼時候要輸出'+',什麼時候要輸出'-'?

輸出'+'的時候:不為第一項,並且係數要大於0(小於0的時候係數自帶負號,直接輸出即可)

輸出'-'的時候:x的指數不為0,並且係數為-1(因為其它的負數自帶負號,直接輸出其它負數的係數就可以輸出那個負號了,-1是一個例外)

程式碼如下:

			//注意輸出的順序,我們應該是有符號就先輸出符號,沒有符號就考慮係數,有係數(係數不是正負1),就輸出係數,最後輸出x和x的指數
			//輸出+號
			if (i != n && a > 0) cout << "+";
			//輸出-號,需要係數為-1,並且指數不為0
			if (a == -1 && i != 0) cout << "-";
  1. 輸出係數,我們要明確我們什麼時候會輸出係數?要係數的值不為正負1,或者是指數為0的情況,我們就需要將正負1的那個係數放出來了,對吧?程式碼如下:
			//輸出係數,需要係數不為正負1,或者後面的指數為0,係數為-1,x的指數為0的情況在這裡。
			if (abs(a) > 1 || i == 0) cout << a;
  1. 輸出x和它的指數,這一步是最簡單的,我們只需要知道指數是不是為1即可(指數為0的情況在前面已經處理了)程式碼如下:
			//輸出x,只有指數為1,這一種情況
			if (i == 1) cout << "x";
			//輸出x^i這種形式,需要指數>1
			if (i > 1) cout << "x^" << i;

完整的程式碼如下:

#include<iostream>
using namespace std;
int main()
{
	int n; cin >> n;
	for (int i = n; i >= 0; i--) {
		int a; cin >> a;
		//如果當前數字為0,就直接跳過
		if (a != 0) {
			//注意輸出的順序,我們應該是有符號就先輸出符號,沒有符號就考慮係數,有係數(係數不是正負1),就輸出係數,最後輸出x和x的指數
			//輸出+號
			if (i != n && a > 0) cout << "+";
			//輸出-號,需要係數為-1,並且指數不為0
			if (a == -1 && i != 0) cout << "-";
			//輸出係數,需要係數不為正負1,或者後面的指數為0,係數為-1,x的指數為0的情況在這裡。
			if (abs(a) > 1 || i == 0) cout << a;
			//輸出x,只有指數為1,這一種情況
			if (i == 1) cout << "x";
			//輸出x^i這種形式,需要指數>1
			if (i > 1) cout << "x^" << i;
		}
	}
	return 0;
}

自己跑一遍流程

很多時候我們都不知道我們寫的程式碼是否有bug,而且如果是競賽中寫題,部分競賽會有罰時,這時候我們就需要自己模擬著去跑一遍流程了

首先,輸入係數,如果係數為0,直接跳過,進入下一層迴圈,否則,就進入處理的邏輯

如果這是第一項的話,就進入處理係數的環節,執行if (abs(a) > 1 || i == 0) cout << a;這條語句

否則,進入第一條語句:if (i != n && a > 0) cout << "+";,輸出+號,然後再進入上面那條語句,然後再處理係數

然後就是處理x和它的指數了,似乎沒問題,我們把特殊的幾種情況羅列一下,看看能不能正確處理,如果能,那就是對的

  1. 輸入第一項,我們會進入處理係數的步驟,沒問題
  2. 輸入負的係數,並且不為正負1,我們會進入直接輸出係數的步驟,沒問題
  3. 輸入係數為-1,但是指數為0,我們仍然會輸出這個係數,沒問題。
  4. 輸入係數為1,但是指數也為0,我們也會輸出這個係數,也沒問題。

我們還可以列舉多幾種情況,檢查一下,其實我們這個邏輯是沒有問題的。

總結與反思

做題不要一上來就把所有的情況列舉出來,有時候所有情況列舉出來只會複雜度很,我們需要從大局上面觀察

相關文章