从控制台分别输入两个关于x的多项式,其中各项系数均为整数,输入时乘号不可忽略,乘方以“^”表示,x的指数按降序排列。各操作数、运算符之间用空格分隔。输出两个多项式相乘的结果,其中x的指数按降序排列。要求:使用队列的顺序存储实现,用c语言,输出代码
时间: 2023-05-25 13:06:03 浏览: 110
#include <stdio.h>
#include <stdlib.h>
#define MAX 100 // 最多支持的项数
typedef struct {
int coef; // 系数
int expn; // 指数
}term;
typedef struct {
term data[MAX]; // 存储多项式的数组
int len; // 多项式项数
}Poly;
void InitPoly(Poly *p){
p->len = 0;
}
void InputPoly(Poly *p) {
int coef, expn;
char ch;
do {
scanf("%d%c%d", &coef, &ch, &expn); // 用%c读入乘号,忽略
p->data[p->len].coef = coef; // 存储系数
p->data[p->len].expn = expn; // 存储指数
p->len++;
ch = getchar(); // 读取下一个字符
} while (ch == ' ' && p->len < MAX); // 最多只读取MAX个项
}
Poly MultiplyPoly(Poly p, Poly q) {
Poly result;
InitPoly(&result); // 初始化结果多项式
// 两个多项式相乘
for (int i = 0; i < p.len; i++) {
for (int j = 0; j < q.len; j++) {
int coef = p.data[i].coef * q.data[j].coef; // 计算系数
int expn = p.data[i].expn + q.data[j].expn; // 计算指数
int k;
for (k = 0; k < result.len; k++) {
if (expn > result.data[k].expn) { // 如果当前指数大于已有项的指数
// 把后面的项都往后移一位
for (int m = result.len - 1; m >= k; m--) {
result.data[m+1].coef = result.data[m].coef;
result.data[m+1].expn = result.data[m].expn;
}
result.len++; // 多项式项数加1
// 插入新项
result.data[k].coef = coef;
result.data[k].expn = expn;
break;
} else if (expn == result.data[k].expn) { // 如果当前指数等于已有项的指数
result.data[k].coef += coef; // 相加合并当前项
break;
}
}
if (k == result.len) { // 如果当前指数小于所有已有项的指数
if (result.len < MAX) { // 如果结果多项式还未满
// 直接插入新项
result.data[k].coef = coef;
result.data[k].expn = expn;
result.len++;
} else {
printf("多项式项数超过最大值!\n");
exit(1);
}
}
}
}
return result;
}
void PrintPoly(Poly p) {
for (int i = 0; i < p.len; i++) {
printf("%d*x^%d ", p.data[i].coef, p.data[i].expn); // 输出多项式的每一项
if (i < p.len - 1) putchar('+'); // 最后一项无需输出+
}
putchar('\n');
}
int main() {
Poly p, q, m;
printf("请输入两个多项式p和q(x的指数按降序排列):\n");
InitPoly(&p);
InputPoly(&p);
InitPoly(&q);
InputPoly(&q);
m = MultiplyPoly(p, q); // 获得两个多项式的积
printf("p*q=");
PrintPoly(m); // 输出结果
return 0;
}
阅读全文