实验题目:多项式乘法问题
实验内容与要求 一元稀疏多项式简单计算器的基本功能是:
(1)输入并建立多项式。;
(2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,…,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列。
(3)多项式a与多项式b相乘,建立多项式。
代码运行截图:
说明:
1.截图中执行的是2操作,即多项式相乘操作(默认两个多项式相乘)
2.先输入第一个多项式的项数3,接着按照提示输入3个单项式的系数和指数,即输入
1x2+ 2x3+3x4
3.输入第二项多项式的项数2,然后输入2个单项式,即
1x2+2x1
4.两个多项式相乘结果为(1x4+ 2x3+2x5+4x4+3x6+6x5)
5.合并同类项后按照降幂顺序输出结果:
3x6+8x5+5x4+2x3
代码如下:
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct Multi)
struct Multi {//系数int ci;//指数int ei;struct Multi* next;
};
char Q;
int Mlen;//输入多项式的项数
int Total;//多项式合并后项数
int main()
{ struct Multi* head;int getLen();int len;void sort(struct Multi* head,int len);void output(struct Multi* head,int Mlen);struct Multi* establish();struct Multi* multiply(struct Multi* heada, struct Multi* headb, int len1, int len2);struct Multi* head1, * head2,*Head;int len1, len2;printf("请输入操作类型:1.建立多项式并输出;2.多项式相乘;0.退出\n");Q = getchar();while (1){if (Q == '0')return 0;else if (Q == '1'){head = establish();printf("\n****************分界线*******************\n");sort(head, Mlen);output(head,Mlen);printf("\n");printf("请输入操作类型:1.建立多项式并输出;2.多项式相乘;0.退出\n");}else if (Q == '2'){head1 = establish();len1 = Mlen;head2 = establish();len2 = Mlen;Head = multiply(head1, head2, len1, len2);sort(Head, Total);printf("****************************************\n");output(Head,Mlen);printf("\n");printf("请输入操作类型:1.建立多项式并输出;2.多项式相乘;0.退出\n");}Q = getchar();}return 0;
}
//接收多项式项数
int getLen()
{int len;printf("请输入多项式的项数:\n");scanf_s("%d", &len);return len;
}
//建立多项式函数
struct Multi* establish()
{int n=0;int k=1,l=0;Mlen = getLen();struct Multi* head;struct Multi* p1, *p2;struct Multi* q1, q2;p1 = p2 = (struct Multi*)malloc(LEN);head = p1;//输入printf("请输入第1项的系数和指数:\n");scanf_s("%d%d", &p1->ci, &p1->ei);int i = 2;while (k < Mlen){n=n+1;k++;if (n == 1)head = p1;else p2->next = p1;p2 = p1;p1 = (struct Multi*)malloc(LEN);printf("请输入第%d项的系数和指数:\n", i);i++;scanf_s("%d%d", &p1->ci, &p1->ei);}p2->next = p1;p1->next= NULL;return head;
}
//排序函数
void sort(struct Multi* head, int len)
{int m, n;for (int i = 0; i < len - 1; i++){struct Multi* cur = head;for (int j = 0; j < len - 1 - i; j++){if (cur->ei < cur->next->ei){m = cur->ei;cur->ei = cur->next->ei;cur->next->ei = m;//n = cur->ci;cur->ci = cur->next->ci;cur->next->ci = n;}cur = cur->next;}}
}
//输出函数
void output(struct Multi* head,int n)
{while (head!=NULL){printf("%dx^%d^", head->ci, head->ei);head = head->next; if(head!=NULL&&head->ci>=0)printf("+");}
}
//多项式相乘函数,返回值为头指针
struct Multi* multiply(struct Multi* heada, struct Multi* headb, int len1, int len2)//链表a的头指针,链表b的头指针,链表a的长度,链表b的长度
{struct Multi* p1, * p2, * tail;struct Multi* q1, * q2;q1 = heada;q2 = headb;struct Multi* head;//目标指针struct Multi* object;//目标链表头指针struct Multi* Mhead;int n = 0;p1 = p2 = (struct Multi*)malloc(LEN);head = NULL;for (; q1 != NULL; q1 = q1->next){for (; q2 != NULL; q2 = q2->next){p1->ei = q1->ei + q2->ei;p1->ci = q1->ci * q2->ci;n++;if (n == 1)head = p1;elsep2->next = p1;p2 = p1;p1 = (struct Multi*)malloc(LEN);}q2 = headb;}p1 = NULL;p2->next = p1;//合并同类项tail = head;Mhead = head;Total = len1 * len2;for (p1 = head; p1 != NULL; p1 = p1->next){tail = p1;for (p2 = p1->next; p2 != NULL;){if (p2 != NULL && p1->ei == p2->ei){p1->ci = p1->ci + p2->ci;p2 = tail->next;tail->next = p2->next;free(p2);//删除结点Total--;p2 = tail->next;}else{tail = p2;p2 = p2->next;}}}tail = NULL;return Mhead;
}
有什么不足的地方欢迎大家指出(ε≡٩(๑>₃<)۶ 一心向学)