數據結構與算法實驗題 2.2 簡單實系數一元多項式問題
★問題描述:
★數據輸入:
第一行有一個正整數 k,表示有 k 個一元實系數多項式。接下來有 k(k<=20)個數據塊,每個數據塊的第 1行是 1 個正整數 s,表示該數據塊共有 s行。接下來的 s 行中,每行由實數 a和整數 b組成,表示多項式中的項 axbaxb 。緊接着 k 個數據塊的是長度為 k-1 的字符串,每個字符是“+”,“-”,“*”這 3 個字符之一。
★數據輸出:
文件的第一行是計算得到的多項式 g(x),輸出多項式時,xkxk 用 x^k 表示。例如,5xk5xk 應表示為 5x^5。注意輸出的結果應該符合數學中手寫習慣。例如,x不應輸出為 1x^1,實系數 保留 6位有效數字。(數據保證多項式項數不大於 500)
★補充說明
整數 b 滿足 b 為非負整數
輸出的多項式結果,按項的冪次從高到低排序,參見樣例
★Hint
c++中可以使用 setprecision 操作符來控制顯示浮點數值的有效數的數量
該題主要使用數組模擬運算,詳細注釋如下
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
double a[22][51000];
//構建二維數組,如a[m][n]=j代表第m個多項式的第n次方項(冪次(指數)為n的項)的系數為j;(即次冪為n的項為 j*x^n)
//比如第2個多項式的5*x^6就應該表示為a[2][6]=5;
double b[51000];//數組b用來存乘法運算的結果
//數組下標代表指數(次冪),b[m]=n 代表指數為m的項的系數為n;
int main() {
int k, t, y, ymax = 0;
double x;
//數據輸入
scanf("%d", &k);//代表具有k個多項式,k個數據塊
for (int i = 1; i <= k; i++) {
cin >> t;//表明該數據塊共有t行
while (t--) {//輸入t次
cin >> x >> y;
a[i][y] = x;//代表第i個多項式的y次方項的系數為x;
if (y > ymax) ymax = y;//ymax用來記錄最高的指數,即最高次冪
}
}
char temp[510];
for (int i = 1; i <= k - 1; i++) {
cin >> temp[i];//輸入運算符
}
//多項式運算
for (int i = 1; i <= k - 1; i++) {
if (temp[i] == '+') {
for (int j = 0; j <= ymax; j++) {
a[i + 1][j] += a[i][j];//指數從零到ymax,將兩個多項式指數相同的項相加,並將結果存在后一個多項式中
//將結果存在后一個多項式,是因為運算后的結果可能還要與下一個多項式進行下一次運算
}
}
if (temp[i] == '-') {
for (int j = 0; j <= ymax; j++) {
a[i + 1][j] = a[i][j] - a[i + 1][j];
//和運算‘+’相似,只不過把“相加” 變為 “相減”
}
}
if (temp[i] == '*') {
int t = ymax;
memset(b, 0, sizeof(b));//將數組b清零,因為乘法運算可能不止一次,所以每一次都要將數組b清零
for (int j = 0; j <= t; j++) {
for (int m = 0; m <= t; m++) {
b[j + m] += a[i][j] * a[i + 1][m];//由於 x^j * x^m=x^(j+m),所以將系數的運算結果存到b[j+m]
if (j + m > ymax && b[j + m]) ymax = j + m;//如果運算結果產生的新項的指數大於ymax,就更新ymax
}
}
for (int j = 0; j <= ymax; j++) {
a[i + 1][j] = b[j];//將運算結果放回參與運算的兩個多項式中的第二個多項式
//cout << b[j] << " ";
}
}
}
//數據輸出
//數據輸出需要考慮最高項的輸出(即首先輸出的項)和其他項的輸出
//還需要考慮系數和指數為“+1、-1”時輸出的情況,還有系數為大於0時要輸出“+”
//最高項輸出的分類討論
while (a[k][ymax] == 0 && ymax) {//如果最高項為0的話就跳過
ymax--;
}
if (ymax != 1 && ymax != 0) {//但次冪為1和0的時候需要特判
if (a[k][ymax] == 1) {//如果系數為1不輸出系數
cout << "x^" << ymax;
}
else if (a[k][ymax] == -1) {//系數為-1只輸出負號
cout << "-x^" << ymax;
}
else {
cout << a[k][ymax] << "x^" << ymax;//其他情況正常輸出
}
}
else if (ymax == 1) {//只輸出x,不輸出指數
if (a[k][ymax] == 1) {//當系數為1時不輸出系數
cout << "x";
}
else if (a[k][ymax] == -1) {//系數為-1時只輸出負號
cout << "-x";
}
else {
cout << a[k][ymax] << "x";//其他情況正常輸出
}
}
else {
cout << a[k][ymax];//當最高次冪為0時直接輸出系數
}
//除最高項的輸出
for (int i = ymax - 1; i >= 0; i--) {
if (a[k][i] > 0) cout << '+';//如果系數為正,需要輸出‘+’
if (fabs(a[k][i] - 0) > 0.000001) {//即當a[k][i]!=0時
if (a[k][i] != 1 && a[k][i] != -1) {
cout << a[k][i];//系數不為正負一時直接輸出
}
else {
if (i == 0) {
cout << a[k][i];//指數為0時只輸出系數
}
}
if (a[k][i] == -1) cout << '-';//系數為-1的特判
if (i > 1) {
cout << "x^" << i;
}
if (i == 1) {
cout << 'x';//指數為1的特判
}
}
}
return 0;
}