開啟章節選單
392 Polynomial Showdown
題目連結
題目敘述
給定一個多項式的係數,從次數 8 到 0,請將其格式化為可讀的形式,並移除不必要的字元。
例如,給定係數 0, 0, 0, 1, 22, -333, 0, 1, -1
,應輸出:x^5 + 22x^4 - 333x^3 + x - 1
。
格式化規則:
-
項目必須按照次數遞減的順序排列。
-
指數應該顯示在脫字符號(
^
)之後。 -
常數項僅顯示其數值。
-
僅顯示係數不為零的項目,除非所有項目係數皆為零,此時應顯示常數項。
-
在加號(
+
)和減號(−
)兩側應各有一個空格。 -
如果最高次項的係數為正,則不應在其前加正號;若為負,則應在其前加負號,例如:
-7x^2 + 30x + 66
。 -
負項應表示為減去其絕對值的項目(除了負的最高次項,應如上所述表示)。例如,不應寫成
x^2 + -3x
,而應寫成x^2 - 3x
。 -
係數為 1 或 -1 的項目,僅在其為常數項時顯示其數值。也就是說,不應寫成
-1x^3 + 1x^2 + 3x^1 - 1
,而應寫成-x^3 + x^2 + 3x - 1
。
輸入格式
輸入包含一或多行,每行有九個以空格分隔的整數,代表從次數 8 到 0 的係數。每個係數的絕對值小於 1000。
輸出格式
對於每一行輸入,輸出對應格式化後的多項式,每行一個。
解題思路
處理不同情況 :
- 係數為 0 的項不用輸出
- 預先處理正負號
- 係數為 1 時不用輸出係數
- 1 次項不用輸出次方
- 0 次項只要輸出係數
程式碼
#include <bits/stdc++.h> using namespace std; int main() { int coeffs[9]; // 用來儲存多項式的 9 個係數(從 x^8 到常數項) // 持續讀入直到檔案結尾(EOF) while (cin >> coeffs[0]) { // 讀入其餘的 8 個係數 for (int i = 1; i < 9; ++i) { cin >> coeffs[i]; } bool firstTerm = true; // 判斷是否是第一個非零項 // 從最高次的項(x^8)開始處理到常數項(x^0) for (int i = 0; i < 9; ++i) { int exp = 8 - i; // 對應的次方數 // 如果係數是 0,就略過這一項 if (coeffs[i] == 0) { continue; } // 如果不是第一個非零項,根據正負號輸出 + 或 - if (!firstTerm) { cout << (coeffs[i] > 0 ? " + " : " - "); } else { // 第一個項目,如果是負的要加負號,正的不用加正號 if (coeffs[i] < 0) { cout << "-"; } firstTerm = false; // 第一項已經處理完 } int absCoef = abs(coeffs[i]); // 取得絕對值(避免重複印負號) if (exp == 0) { // 如果是常數項(x^0),直接印出係數 cout << absCoef; } else { // 如果不是常數項 if (absCoef != 1) { // 當係數不是 ±1 時才印出係數(例如:3x^2) cout << absCoef; } cout << "x"; // 印出變數 x if (exp != 1) { // 如果次方不是 1,印出 ^ 指數(例如:x^3) cout << "^" << exp; } } } // 如果全部係數都是 0,就輸出 0 if (firstTerm) { cout << "0"; } cout << endl; // 換行,準備處理下一筆輸入 } }