/*线性结构2 一元多项式的乘法与加法运算
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。
数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。
零多项式应输出0 0。
输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
*/
/*本题是浙大MOOC数据结构的习题,本解采用动态数组实现,与书上单链表思想基本相同,细节略有不同*/
#include <iostream>
{
int coef;
int expon;
} Polynomial;
void Polyadd(Polynomial *a, Polynomial *b, Polynomial *c, int m, int n);
void Polymult(Polynomial *a, Polynomial *b, Polynomial *d, int m, int n);
{
int m, n;
Polynomial *a, *b, *c, *d;
cin >> m;
a = new Polynomial[m];
for(int i=0; i<m; i++)
{
cin >> a[i].coef >> a[i].expon;
}
cin >> n;
b = new Polynomial[n];
for(int j=0; j<n; j++)
{
cin >> b[j].coef >> b[j].expon;
}
c = new Polynomial[m+n]; //求和多项式初始化为零
for(int i=0;i<m+n; i++)
{
c[i].coef = 0;
c[i].expon = 0;
}
d = new Polynomial[m*n]; //求积多项式初始化为零
for(int j=0; j<m*n; j++)
{
d[j].coef = 0;
d[j].expon = 0;
}
Polyadd(a, b, c, m, n);
Polymult(a, b, d, m, n);
Polyoutput(d);
Polyoutput(c);
return 0;
}
void Polyadd(Polynomial *a, Polynomial *b, Polynomial *c, int m, int n)
{
int i=0, j=0, k=0;
while(i<m && j<n)
{
if(a[i].expon>b[j].expon)
{
c[k] = a[i];
i++;
k++;
}
else if(a[i].expon<b[j].expon)
{
c[k] = b[j];
j++;
k++;
}
else
{
int temp;
temp = a[i].coef + b[j].coef;
if(temp != 0)
{
c[k].coef = temp;
c[k].expon = a[i].expon;
i++;
j++;
k++;
}
else
{
i++;
j++;
}
}
}
while(i<m)
{
c[k] = a[i];
i++;
k++;
}
while(j<n)
{
c[k] = b[j];
j++;
k++;
}
}
void Polymult(Polynomial *a, Polynomial *b, Polynomial *d, int m, int n) //乘法利用加法循环实现
{
Polynomial *temp1, *temp2;
temp1 = new Polynomial[n];
temp2 = new Polynomial[m*n];
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
temp1[j].coef = a[i].coef * b[j].coef;
temp1[j].expon = a[i].expon + b[j].expon;
}
for(int k=0; k<m*n; k++)
{
temp2[k] = d[k];
}
Polyadd(temp1, temp2, d, n, m*n);
}
}
void Polyoutput(Polynomial *p)
{
int count=0;
while(p[count].coef != 0) //求非零项数
count++;
if(count==0)
cout << "0 0" << endl;
else
{
for(int j=0; j<count; j++)
{
cout << p[j].coef << " " << p[j].expon << (j+1==count ? "" : " ");
}
cout << endl;
}
}
设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。
数字间以空格分隔。
输出格式:
输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。
零多项式应输出0 0。
输入样例:
4 3 4 -5 2 6 1 -2 0
3 5 20 -7 4 3 1
输出样例:
15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0
*/
/*本题是浙大MOOC数据结构的习题,本解采用动态数组实现,与书上单链表思想基本相同,细节略有不同*/
#include <iostream>
using namespace std;
typedef struct polynode{
int coef;
int expon;
} Polynomial;
void Polyadd(Polynomial *a, Polynomial *b, Polynomial *c, int m, int n);
void Polymult(Polynomial *a, Polynomial *b, Polynomial *d, int m, int n);
void Polyoutput(Polynomial *p);
int main(){
int m, n;
Polynomial *a, *b, *c, *d;
cin >> m;
a = new Polynomial[m];
for(int i=0; i<m; i++)
{
cin >> a[i].coef >> a[i].expon;
}
cin >> n;
b = new Polynomial[n];
for(int j=0; j<n; j++)
{
cin >> b[j].coef >> b[j].expon;
}
c = new Polynomial[m+n]; //求和多项式初始化为零
for(int i=0;i<m+n; i++)
{
c[i].coef = 0;
c[i].expon = 0;
}
d = new Polynomial[m*n]; //求积多项式初始化为零
for(int j=0; j<m*n; j++)
{
d[j].coef = 0;
d[j].expon = 0;
}
Polyadd(a, b, c, m, n);
Polymult(a, b, d, m, n);
Polyoutput(d);
Polyoutput(c);
return 0;
}
void Polyadd(Polynomial *a, Polynomial *b, Polynomial *c, int m, int n)
{
int i=0, j=0, k=0;
while(i<m && j<n)
{
if(a[i].expon>b[j].expon)
{
c[k] = a[i];
i++;
k++;
}
else if(a[i].expon<b[j].expon)
{
c[k] = b[j];
j++;
k++;
}
else
{
int temp;
temp = a[i].coef + b[j].coef;
if(temp != 0)
{
c[k].coef = temp;
c[k].expon = a[i].expon;
i++;
j++;
k++;
}
else
{
i++;
j++;
}
}
}
while(i<m)
{
c[k] = a[i];
i++;
k++;
}
while(j<n)
{
c[k] = b[j];
j++;
k++;
}
}
void Polymult(Polynomial *a, Polynomial *b, Polynomial *d, int m, int n) //乘法利用加法循环实现
{
Polynomial *temp1, *temp2;
temp1 = new Polynomial[n];
temp2 = new Polynomial[m*n];
for(int i=0; i<m; i++)
{
for(int j=0; j<n; j++)
{
temp1[j].coef = a[i].coef * b[j].coef;
temp1[j].expon = a[i].expon + b[j].expon;
}
for(int k=0; k<m*n; k++)
{
temp2[k] = d[k];
}
Polyadd(temp1, temp2, d, n, m*n);
}
}
void Polyoutput(Polynomial *p)
{
int count=0;
while(p[count].coef != 0) //求非零项数
count++;
if(count==0)
cout << "0 0" << endl;
else
{
for(int j=0; j<count; j++)
{
cout << p[j].coef << " " << p[j].expon << (j+1==count ? "" : " ");
}
cout << endl;
}
}