设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分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
代码长度限制
16 KB
时间限制
200 ms
内存限制
64 MB
栈限制
下面提供两种方式,②无论是在时间还是空间上都更加优越。建议自己敲一遍,不要直接复制!
①用数组保存数据的顺序存储方式
#include<stdio.h>
#include<stdlib.h>
#define Maxsize 1000
typedef struct{
int coef = 0;
int expn = 0;
}Polynomial;
void multiplyPolynomials(Polynomial *p1,int s1,Polynomial *p2,int s2,Polynomial *p3){
for(int i=0;i<=s1;i++){
for(int j=0;j<=s2;j++){
//指数相加
int k = p1[i].expn+p2[j].expn;
p3[k].expn = k;
p3[k].coef += p1[i].coef*p2[j].coef;
}
}
}
void addPolynomial(Polynomial *p1,int s1,Polynomial *p2,int s2,Polynomial *p3){
int i = 0,j = 0,k=0;
while(i<=s1&&k<=s2){
p3[k].coef = p1[i].coef+p2[j].coef;
i++;
j++;
k++;
}
}
void printPolynomial(Polynomial *p3,int size3){
for(int i=size3;i>=0;i--){
//系数不为0的倒着输出
if(p3[i].coef){
printf("%d %d ",p3[i].coef,p3[i].expn);
}
}
}
int main(){
//存储p1
int t1,t2,size1,size2;
Polynomial p1[Maxsize+1],p2[Maxsize+1];
scanf("%d",&size1);
//循环size次
for(int i=size1;i>=1;i--){
scanf(" %d %d",&t1,&t2);
p1[t2].coef = t1;
p1[t2].expn = t2;
}
scanf("%d",&size2);
for(int i=size2;i>=1;i--){
scanf(" %d %d",&t1,&t2);
p2[t2].coef = t1;
p2[t2].expn = t2;
}
//定义和初始化辅助数组,估计最大容量
int maxsize = Maxsize*2;
Polynomial p3[maxsize+1];
//乘法
multiplyPolynomials(p1,Maxsize,p2,Maxsize,p3);
//打印
printPolynomial(p3,maxsize);
addPolynomial(p1,Maxsize,p2,Maxsize,p3);
printf("\n");
printPolynomial(p3,maxsize);
return 0;
}
②以链表存储数据的链式存储方式
//以链表的链式存储做多项式计算
#include<stdio.h>
#include<stdlib.h>
//定义包括两个数据和next
typedef struct LNode{
int coef;
int expn;
struct LNode *next;
}LNode,*Linklist;
void ListInsert(LNode *head,int length){
//尾指针
Linklist p = head;
for(int i=1;i<=length;i++){
Linklist node = (LNode *)malloc(sizeof(LNode));
scanf("%d%d",&node->coef,&node->expn);
node->next = NULL ;
//插入
p->next = node;
p = node;
}
}
void Listprint(LNode *head){
Linklist p = head->next;
int flag = 0;
while(p){
if(flag == 0){
flag = 1;
printf("%d %d",p->coef,p->expn);
}
else
printf(" %d %d",p->coef,p->expn);
p = p->next;
}
}
void ListLocateandInsertorWrite(LNode *head,int e,int c){
if(head->next == NULL){
LNode *node = (LNode *)malloc(sizeof(LNode));
node->coef = c;
node->expn = e;
//插入
head->next = node;
node->next = NULL;
}else{
Linklist p = head->next;
Linklist pre = head;
int flag = 0;
while(p){
if (e>p->expn){
LNode *node = (LNode *)malloc(sizeof(LNode));
node->coef = c;
node->expn = e;
//插入
node->next = p;
pre->next = node;
flag = 1;
break;
}else if(e==p->expn){
p->coef += c;
flag = 1;
break;
}else{
pre = p;
p = p->next;
}
}
if(!flag){
LNode *node = (LNode *)malloc(sizeof(LNode));
node->coef = c;
node->expn = e;
pre->next = node;
node->next = NULL;
}
}
}
void ListMutiply(LNode *head1,LNode *head2,LNode *head3){
//head1的coef*和expn加完后locate链表3,先check有没有相同的值,没有就插入到大 x 小中间,有就修改值。
Linklist p1 = head1->next;
Linklist p2 = head2->next;
//以head1遍历,每次head2和head3的指针都要返回到回头
int c,e;
while(p1){
while(p2){
c = p1->coef*p2->coef;
if(c){
e = p1->expn+p2->expn;
//有相同的值直接修改了
//没有就定位插入
ListLocateandInsertorWrite(head3,e,c);
}
p2 = p2->next;
}
p1 = p1->next;
p2 = head2->next;
}
}
void Listadd(LNode *head1,LNode *head2){
//两个指针指向1和2的首元结点,另设一个p3指针和head3链表,若1>2,接在p3后面,2>1,2接在p3后面,
Linklist p1 = head1->next;
Linklist p2 = head2->next;
Linklist p3 = head1;
while(p1&&p2){
if(p1->expn>p2->expn){
p3->next = p1;
p1=p1->next;
p3=p3->next;
}else if(p2->expn>p1->expn){
p3->next = p2;
p2 = p2->next;
p3=p3->next;
}else{
//若1=2,先求系数和判断0
int sum = p1->coef + p2->coef;
if(sum){
p1->coef = sum;
p3->next = p1;
p1 = p1->next;
p3 = p3->next;
Linklist r = p2;
p2 = p2->next;
free(r);
}else{
Linklist r1 = p1;p1 = p1->next;free(r1);
Linklist r2 = p2;p2 = p2->next;free(r2);
}
}
}
p3->next = p1?p1:p2;
free(head2);
}
int main(){
//初始化头指针
LNode *head1 = (LNode *)malloc(sizeof(LNode));
head1->next = NULL;
//存储第一个个数作为循环插入此书
int size1;
scanf("%d",&size1);
//循环尾插法
ListInsert(head1,size1);
//同理
LNode *head2 = (LNode *)malloc(sizeof(LNode));
head2->next = NULL;
int size2;
scanf("%d",&size2);
ListInsert(head2,size2);
//相乘
LNode *head3 = (LNode *)malloc(sizeof(LNode));
head3->next = NULL;
ListMutiply(head1,head2,head3);
//打印链表
Listprint(head3) ;
Listadd(head1,head2);
printf("\n");
Listprint(head1);
return 0;
}