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; // 換行,準備處理下一筆輸入
    }
}