[PTA]一元多项式运算器
Posted Billy Miracle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[PTA]一元多项式运算器相关的知识,希望对你有一定的参考价值。
文章目录
1. 一元多项式运算器——建立与输出
通过键盘接收一组多项式的系数和指数,建立多项式(要求各项按指数升序排列),并按指定格式输出。
输入格式:
第一行输入一个正整数n,表示非零项个数。 第二行输入n对整数,每对形如(7,3),表示系数为7、指数为3的项。
输出格式:
按多项式形式输出,各项按指数升序排列,例如6+2X-7X^8
输入样例:
在这里给出一组输入。例如:
4
(6,0)(2,1)(-8,70)(4,150)
输出样例:
在这里给出相应的输出。例如:
6+2X-8X^70+4X^150
//结尾无空行
Answer:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node {
int coef;
int expn;
struct node *next;
}Node, *List;
List Creat(int i) {
List head;
head = (List)malloc(sizeof(Node));
List pre, pnew;
pre = head;
char a,b;
for(int j = 0; j <= i; j++) {
pnew = (List)malloc(sizeof(Node));
scanf("%c%d,%d%c", &a, &pnew->coef, &pnew->expn, &b);
pre -> next = pnew;
pre = pnew;
}
return head;
}
void Print(List head) {
List q = head->next->next;
int flag = 1;
if(!q) {
putchar('0');
printf("\\n");
return;
}
while(q) {
if(q->coef > 0 && flag != 1) {
putchar('+');
}
if(q->coef != 1 && q->coef != -1) {
printf("%d", q->coef);
if(q->expn == 1) {
putchar('X');
} else if (q->expn) {
printf("X^%d", q->expn);
}
} else {
if(q->coef == 1) {
if(!q->expn) {
putchar('1');
} else if (q->expn == 1) {
putchar('X');
} else {
printf("X^%d", q->expn);
}
}
if(q->coef == -1) {
if(!q->expn) {
printf("-1");
} else if(q->expn == 1) {
printf("-X");
} else {
printf("-X^%d", q->expn);
}
}
}
q = q->next;
flag++;
}
}
int main() {
int i;
scanf("%d", &i);
List head;
head = Creat(i);
Print(head);
}
2. 一元多项式运算器——加法
一元多项式运算器——加法(by Yan)实现两个一元多项式相加运算。
输入格式:
按2.3.1的格式,第一、二行输入一个加数;第三、四行输入另一个加数。
输出格式:
按2.3.1的格式,输出和多项式。
输入样例:
在这里给出一组输入。例如:
5
(6,0)(2,1)(8,7)(4,15)(3,18)
3
(7,1)(2,6)(-8,7)
//结尾无空行
输出样例:
在这里给出相应的输出。例如:
6+9X+2X^6+4X^15+3X^18
//结尾无空行
Answer:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node {
int coef;
int expn;
struct node *next;
}Node, *List;
List Creat(int i) {
List head;
head = (List)malloc(sizeof(Node));
List pre, pnew;
pre = head;
char a,b;
for(int j = 0; j <= i; j++) {
pnew = (List)malloc(sizeof(Node));
scanf("%c%d,%d%c", &a, &pnew->coef, &pnew->expn, &b);
pre -> next = pnew;
pre = pnew;
}
return head;
}
void Print(List head) {
List q = head->next->next;
int flag = 1;
if(!q) {
putchar('0');
printf("\\n");
return;
}
while(q) {
if(q->coef > 0 && flag != 1) {
putchar('+');
}
if(q->coef != 1 && q->coef != -1) {
printf("%d", q->coef);
if(q->expn == 1) {
putchar('X');
} else if (q->expn) {
printf("X^%d", q->expn);
}
} else {
if(q->coef == 1) {
if(!q->expn) {
putchar('1');
} else if (q->expn == 1) {
putchar('X');
} else {
printf("X^%d", q->expn);
}
}
if(q->coef == -1) {
if(!q->expn) {
printf("-1");
} else if(q->expn == 1) {
printf("-X");
} else {
printf("-X^%d", q->expn);
}
}
}
q = q->next;
flag++;
}
}
List Plus(List head1, List head2) {
List pre = NULL, p = NULL, qre = NULL, q = NULL;
pre = head1->next;
p = head1->next->next;
qre = head2->next;
q = head2->next->next;
int index = 1;
while (p != NULL) {
if (q == NULL) {
return head1;
}
if (p->expn == q->expn) {
p->coef = p->coef + q->coef;
if (p->coef == 0) {
pre->next = p->next;
free(p);
if (pre) {
p = pre->next;
} else {
p = NULL;
}
qre->next = q->next;
free(q);
if (qre) {
q = qre->next;
} else {
q = NULL;
}
} else {
pre = p;
p = p->next;
qre->next = q->next;
free(q);
if (qre) {
q = qre->next;
} else {
q = NULL;
}
}
// printf("4\\n");
} else if (p->expn > q->expn) {//多项式1的项的指数大于多项式2的项时
qre->next = q->next;
q->next = p;
pre->next = q;
pre = q;
q = qre->next;
// printf("3\\n");
} else if (q->expn > p->expn && p->next &&q->expn < (p->next)->expn) {//多项式2的项指数大小在多项式1的项与下一项中间时
// printf("1\\n");
qre->next = q->next;
pre = p;
p = p->next;
q->next = p;
pre->next = q;
pre = q;
q = qre->next;
} else if (q->expn > p->expn && p->next && q->expn >= (p->next)->expn) {
pre = p;
p = p->next;
// printf("2\\n");
} else {
pre = p;
break;
}
index ++;
}
if (q) {//多项式2未计算完
pre->next = q;
}
return head1;
}
int main() {
int i1, i2;
List head1, head2;
scanf("%d", &i1);
head1 = Creat(i1);
scanf("%d", &i2);
head2 = Creat(i2);
List head = Plus(head1, head2);
Print(head);
}
3. 一元多项式运算器——减法
实现两个一元多项式相减运算。
输入格式:
按2.3.1的格式,第一、二行输入被减数;第三、四行输入减数。
输出格式:
按2.3.1的格式,输出差多项式。
输入样例:
在这里给出一组输入。例如:
4
(6,0)(2,6)(8,7)(4,15)
5
(7,1)(2,6)(-8,7)(10,20)(16,30)
//结尾无空行
输出样例:
在这里给出相应的输出。例如:
6-7X+16X^7+4X^15-10X^20-16X^30
//结尾无空行
Answer:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node {
int coef;
int expn;
struct node *next;
}Node, *List;
List Creat(int i) {
List head;
head = (List)malloc(sizeof(Node));
List pre, pnew;
pre = head;
char a,b;
for(int j = 0; j <= i; j++) {
pnew = (List)malloc(sizeof(Node));
scanf("%c%d,%d%c", &a, &pnew->coef, &pnew->expn, &b);
pre -> next = pnew;
pre = pnew;
}
return head;
}
void Print(List head) {
List q = head->next->next;
int flag = 1;
if(!q) {
putchar('0');
printf("\\n");
return;
}
while(q) {
if(q->coef > 0 && flag != 1) {
putchar('+');
}
if(q->coef != 1 && q->coef != -1) {
printf("%d", q->coef);
if(q->expn == 1) {
putchar('X');
} else if (q->expn) {
printf("X^%d", q->expn);
}
} else {
if(q->coef == 1) {
if(!q->expn) {
putchar('1');
} else if (q->expn == 1) {
putchar('X');
} else {
printf("X^%d", q->expn);
}
}
if(q->coef == -1) {
if(!q->expn) {
printf("-1");
} else if(q->expn == 1) {
printf("-X");
} else {
printf("-X^%d", q->expn);
}
}
}
q = q->next;
flag++;
}
}
List Plus(List head1, List head2) {
List pre = NULL, p =以上是关于[PTA]一元多项式运算器的主要内容,如果未能解决你的问题,请参考以下文章