文章目录
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 = 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的项时
q->coef = -q->coef;
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的项与下一项中间时
q->coef = -q->coef;
// 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;
List qq = q;
while(qq) {
qq->coef = - qq->coef;
qq = qq->next;
}
}
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);
}
4. 一元多项式运算器——乘法
实现两个一元多项式相乘运算。
输入格式:
按2.3.1的格式,第一、二行输入一个乘数;第三、四行输入另一个乘数。
输出格式:
按2.3.1的格式,输出积多项式。
输入样例:
在这里给出一组输入。例如:
3
(6,0)(2,6)(8,7)
2
(7,1)(-8,7)
//结尾无空行
输出样例:
在这里给出相应的输出。例如:
42X-34X^7+56X^8-16X^13-64X^14
//结尾无空行
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 CopyList (List head) {
List newHead = (List)malloc(sizeof(Node));
newHead->next = NULL;
List p = head->next;
List p2 = newHead;
while (p) {
List new = (List)malloc(sizeof(Node));
new->coef = p->coef;
new->expn = p->expn;
p2->next = new;
p2 = new;
p = p->next;
}
p2->next = NULL;
return newHead;
}
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;
}
List Multiply (List head1, List head2) {
List p2 = head2->next->next;
List newHead = (List)malloc(sizeof(Node));
List pp = (List)malloc(sizeof(Node));
newHead->next = pp;
pp->next = NULL;
List p1;
List head1Pre = CopyList(head1);
List res = NULL;
while (p2) {
p1 = head1->next->next;
while (p1) {
p1->coef *= p2->coef;
p1->expn += p2->expn;
p1 = p1->next;
}
p2 = p2->next;
res = Plus(head1, newHead);
newHead = CopyList(head1);
head1 = CopyList(head1Pre);
}
return res;
}
int main() {
int i1, i2;
List head1, head2;
scanf("%d", &i1);
head1 = Creat(i1);
scanf("%d", &i2);
head2 = Creat(i2);
List head = Multiply(head1, head2);
Print(head);
}
5. 一元多项式运算器——求值
对于给定的X值,求出多项式的值。
输入格式:
第一、二行按2.3.1的格式,输入一个多项式; 第三行输入X的值。
输出格式:
输出多项式的值
输入样例:
在这里给出一组输入。例如:
4
(6,0)(2,3)(8,5)(7,10)
2
//结尾无空行
输出样例:
在这里给出相应的输出。例如:
7446
//结尾无空行
Answer:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.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;
}
int Calculate(List head, int X) {
List q = head->next->next;
if(!q) {
return 0;
}
int r = 0;
while(q) {
r += q->coef * pow(X, q->expn);
q = q->next;
}
return r;
}
int main() {
int i, X;
scanf("%d", &i);
List head;
head = Creat(i);
scanf("%d", &X);
int result = Calculate(head, X);
printf("%d\n", result);
}
6. 一元多项式运算器——求导
实现多项式的求导运算
输入格式:
第一、二行按2.3.1的格式,输入一个多项式;
输出格式:
按2.3.1的格式,输出其导数多项式。
输入样例:
在这里给出一组输入。例如:
4
(6,0)(2,1)(8,7)(4,15)
//结尾无空行
输出样例:
在这里给出相应的输出。例如:
2+56X^6+60X^14
//结尾无空行
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++;
}
}
void Process(List head) {
List pre = head->next;
while (pre->next) {
if (pre->next && pre->next->expn == 0) {
pre->next = pre->next->next;
}
pre = pre->next;
pre->coef *= pre->expn;
pre->expn--;
}
}
int main() {
int i;
scanf("%d", &i);
List head;
head = Creat(i);
Process(head);
Print(head);
}
大家不要把答案直接复制过去哦🤫,要自己思考一下呢!!!