设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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介绍的那样,用链表写,用不同函数实现相乘和相加再输出,代码课程里也给的差不多了,这里就不多阐述了。
第二种方法就是用数组去写,因为输入的数据不超过1000,所以就算相乘最多指数也是到2000。这里就直接开数组,用数组下标代表指数,对应下标存的值代表系数。然后开一个1000的数组记录多项式相加,相加的时候如果两个多项式对应指数都存在,就系数相加就好。只有一个有对应指数,就直接赋值。相乘也是开一个数组,数组开2000,再相乘的时候需要先找到存在多项式中存在的指数再去相乘,然后指数相加后如果已经存在对应指数,就把系数相乘后再加到原来的系数当中,只存在一个的话就把系数相乘之后赋给相加后的下标,即指数。注意0多项式要单独输出一下。
下面给出两种方法的代码
链表方法:
#include <stdio.h>
#include <stdlib.h>
struct Node {
int c;
int e;
struct Node *next;
};
typedef struct Node *polynomial;
polynomial input();
polynomial mul(polynomial p1, polynomial p2);
polynomial add(polynomial p1, polynomial p2);
void print(polynomial p);
void Attach(int c, int e, polynomial *Rear);
int main()
{
polynomial p1, p2, p;
p1 = input();
p2 = input();
p = mul(p1, p2);
print(p);
p = add(p1, p2);
print(p);
return 0;
}
polynomial input()
{
int c, e, n;
polynomial P, t, R;
scanf("%d", &n);
P = (polynomial)malloc(sizeof(struct Node));
P->next = NULL;
R = P;
while(n--){
scanf("%d%d", &c, &e);
Attach(c, e, &R);
}
t = P;
P = P->next;
free(t);
return P;
}
void Attach(int c, int e, polynomial *Rear)
{
polynomial P;
P = (polynomial)malloc(sizeof(struct Node));
P->c = c;
P->e = e;
P->next = NULL;
(*Rear)->next = P;
*Rear = P;
}
polynomial mul(polynomial p1, polynomial p2)
{
if(!p1||!p2)
return NULL;
int c, e;
polynomial t, t1, t2, R, P;
t1 = p1;
t2 = p2;
P = (polynomial)malloc(sizeof(struct Node));
P->next = NULL;
R = P;
while(t2) {
Attach(t1->c*t2->c, t1->e+t2->e, &R);
t2 = t2->next;
}
t1 = t1->next;
while(t1) {
t2 = p2;
R = P;
while(t2) {
c = t1->c * t2->c;
e = t1->e + t2->e;
while(R->next && R->next->e > e){
R = R->next;
}
if(R->next && R->next->e == e){
if(R->next->c + c) {
R->next->c += c;
}
else {
t = R->next;
R->next = t->next;
free(t);
}
} else {
t = (polynomial)malloc(sizeof(struct Node));
t->c = c;
t->e = e;
t->next = R->next;
R->next = t;
R = R->next;
}
t2 = t2->next;
}
t1 = t1->next;
}
t2 = P;
P = P->next;
free(t2);
return P;
}
polynomial add(polynomial p1, polynomial p2)
{
if(!p1&&!p2)
return NULL;
polynomial t1, t2, P, R, t;
P = (polynomial)malloc(sizeof(struct Node));
P->next = NULL;
R = P;
t1 = p1;
t2 = p2;
while(t1&&t2){
if(t1->e > t2->e) {
Attach(t1->c, t1->e, &R);
t1 = t1->next;
} else if(t1->e == t2->e) {
if(t1->c + t2->c) {
Attach(t1->c+t2->c, t1->e, &R);
}
t1 = t1->next;
t2 = t2->next;
} else {
Attach(t2->c, t2->e, &R);
t2 = t2->next;
}
}
while(t1){
Attach(t1->c, t1->e, &R);
t1 = t1->next;
}
while(t2){
Attach(t2->c, t2->e, &R);
t2 = t2->next;
}
t = P;
P = P->next;
free(t);
return P;
}
void print(polynomial p)
{
int flag = 0;
if(!p) {
printf("0 0\n");
return;
}
while(p){
if(!flag){
flag = 1;
} else
printf(" ");
printf("%d %d", p->c, p->e);
p = p->next;
}
printf("\n");
return;
}
数组方法:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
int main()
{
int a[1001] = {0}; //记录第一个一元多项式,数组下标代表指数,所存元素代表系数
int b[1001] = {0}; //记录第二个一元多项式
int sum[1001] = {0}; //记录两个一元多项式相加
int mul[2001] = {0}; //记录两个一元多项式相乘
int i, j, k, n, m, symbol = 0, flat = 0;
cin >> n;
for( i=0; i<n; i++ ) { //读取第一个一元多项式
cin >> j >> k;
a[k] = j;
}
cin >> m;
for( i=0; i<m; i++ ) { //读取第二个一元多项式
cin >> j >> k;
b[k] = j;
}
for( i=1000; i>=0; i-- ) {
if( a[i] && b[i] ) { //当两个多项式指数相同时,系数相加。
sum[i] = a[i] + b[i];
}
if( a[i]==0 && b[i] ) { //当只有一个指数存在时,直接赋值系数,也同时标记了指数
sum[i] = b[i];
}
if( a[i] && b[i]==0 ) {
sum[i] = a[i];
}
}
for( i=1000; i>=0; i--) { //第一层循环控制第一个多项式
if(a[i] == 0) //找存在的指数,即系数不为0
continue;
for( j=1000; j>=0; j--) { //第二层循环控制第二个多项式
if(b[j] != 0) {
if( mul[i+j] ) //当两个指数相乘后,对应指数存在,就将相乘后系数加上去
mul[i+j] = mul[i+j] + a[i] * b[j];
else //当不存在对应指数是,系数就等于两个相乘
mul[i+j] = a[i] * b[j];
}
}
}
for( i=2000; i>=0; i--) { //输出相乘完的一元多项式
if( mul[i] ) {
flat = 1; //flat判断是否是0多项式
if(symbol == 0)
symbol = 1;
else
cout << " ";
cout << mul[i] << " " << i;
}
}
if( !flat ) //零多项式
cout << "0 0";
cout << endl;
flat = 0;
symbol = 0;
for( i=1000; i>=0; i--) {
if( sum[i] ) {
flat = 1; //判断0多项式
if(symbol == 0)
symbol = 1;
else
cout << " ";
cout << sum[i] << " " << i;
}
}
if( !flat )
cout << "0 0" << endl;
return 0;
}