一、题目:
二、代码:[用数组实现]
#include<stdio.h>
const int maxx = 1e3;
struct Node{
int x;
int m;
int isok;//代表已经相加?
};
Node a[maxx];
Node b[maxx];
int cnt1,cnt2;
/*
3
2 3
1 2
2 4
3
3 5
2 3
5 4
*/
void add(Node a[],Node b[],int cnt1,int cnt2) {
int index = 0;
for(int i=0;i<cnt1;i++) {
for(int j=0;j<cnt2;j++) {
if(a[i].m == b[j].m) {
b[j].isok = 1;
a[i].x = a[i].x + b[j].x;
break;
}
}
}
//输出
printf("\n相加后的结果:");
for(int i=0;i<cnt1;i++) {
printf("%d*x^%d",a[i].x,a[i].m);
if(cnt2 != 0) printf(" + ");
}
for(int j=0;j<cnt2;j++) {
if(b[j].isok == 0) {
printf("%d*x^%d + ",b[j].x,b[j].m);
}
}
}
void subtract(Node a[],Node b[],int cnt1,int cnt2) {
//赋值,将第二个多项式的系数赋为其相反数
for(int j=0;j<cnt2;j++) {
b[j].x = -b[j].x;
}
//下面方法跟add一样,因为:类比为两数相减,等同于第一个数+(-1)*第二个数.
int index = 0;
for(int i=0;i<cnt1;i++) {
for(int j=0;j<cnt2;j++) {
if(a[i].m == b[j].m) {
b[j].isok = 1;
a[i].x = a[i].x + b[j].x;
break;
}
}
}
//输出
printf("\n相减后的结果:");
for(int i=0;i<cnt1;i++) {
if(a[i].x < 0) printf(" ");
printf("%d*x^%d",a[i].x,a[i].m);
if(a[i+1].x > 0) printf(" + ");
}
for(int j=0;j<cnt2;j++) {
if(b[j].isok == 0) {
if(b[j].x < 0) printf(" ");
printf("%d*x^%d",b[j].x,b[j].m);
if(b[j+1].x > 0) printf(" + ");
}
}
}
void Multi(Node a[],Node b[],int cnt1,int cnt2) {
Node c[maxx];
int index = 0; //表示相乘后的项数
for(int i=0;i<cnt1;i++) {
for(int j=0;j<cnt2;j++) {
c[index].x = a[i].x * b[j].x;
c[index].m = a[i].m + b[j].m;
index++;
}
}
//中间结果
printf("\n相乘后的中间结果:");
for(int i=0;i<index;i++) {
printf("%d*x^%d",c[i].x,c[i].m);
if(i != index-1) printf(" + ");
}
printf("\n");
int cnt3 = index; //中间变量
//对同幂的进行合并
for(int i=0;i<index-1;i++) {
for(int j=i+1;j<index;j++) {
if(c[i].m == c[j].m && c[j].isok == 0 ){
c[j].isok = 1;
c[i].x = c[i].x + c[j].x;
cnt3--; //项数-1
}
}
}
//最终结果
printf("相乘并合并后:");
for(int i=0;i<cnt3;i++) {
if(c[i].isok == 1) continue;
printf("%d*x^%d",c[i].x,c[i].m);
if(i != cnt3-1) printf(" + ");
}
}
int main(){
printf("请输入第一个多项式的项数:");
scanf("%d",&cnt1);
printf("请输入第一个多项式的cnt1对系数和幂,如:2 3 ;等同于=> 2*x^3\n");
for(int i=0;i<cnt1;i++) {
scanf("%d%d",&a[i].x,&a[i].m);
}
printf("请输入第二个多项式的项数:");
scanf("%d",&cnt2);
printf("请输入第二个多项式的cnt2对系数和幂\n");
for(int i=0;i<cnt2;i++){
scanf("%d%d",&b[i].x,&b[i].m);
}
int n;
printf("请选择功能:[1-相加,2-相减,3-相乘]\n");
while( scanf("%d",&n) ) {
if(n==1 || n==2 || n==3) {
if(n == 1){
add(a,b,cnt1,cnt2);
break;
} else if(n==2) {
subtract(a,b,cnt1,cnt2);
break;
} else {
Multi(a,b,cnt1,cnt2);
break;
}
} else {
printf("输入功能号有误!重新输入!\n");
}
}
return 0;
}
三、测试:
注:用链表实现-相加...
#include <stdio.h>
#include <stdlib.h>
//定义结构体类型
typedef struct Node{
float xishu; //定义系数为浮点数
int zhishu; //定义指数为整型
struct Node *Next;
}Node;
typedef struct Node* PNode; //定义指针类型
//多项式按照指数大小排序
void insertNewPoint_link(PNode head,PNode qNode)
{
PNode p=head; //向head为首的链表中插入qnode结点,由p从head处开始遍历
PNode h=head;
PNode q; //用于销毁节点
while (p->Next!=NULL) //若已输入多项式不止一项
{
//若新项的指数比某一项p大则将新项插在该项前面
if (p->Next->zhishu < qNode->zhishu)
{
qNode->Next = p->Next;
p->Next = qNode;
break; //插完之后即可退出
}
else if(p->Next->zhishu == qNode->zhishu)
{
float sum = p->Next->xishu + qNode->xishu;//计算合并后的系数
if(sum!=0) //若合并后系数不为零
{
p->Next->xishu = sum;//重新赋予p项新的系数
}
else //否则删去已有链表中的第一项
{
q=p->Next;
p->Next= p->Next->Next;
free(q);//销毁结点
q=NULL;
}
break;
}
p = p->Next; //若新项指数小于p当前指向的项则p移至下一项与下一项进行比较
}
if (p->Next == NULL) //若多项式只有一项则无需排序
{
p->Next = qNode;
}
}
//输出多项式
void printLinkeLink(PNode head)
{
PNode temp = head->Next; //建立临时指针用于遍历链表
printf("%fX^%d",temp->xishu,temp->zhishu); //先输出第一项(不用前置符号)
temp=temp->Next; //temp指针指向下一项
while (temp != NULL) //循环输出后续项
{
if (temp->xishu > 0) //若为正系数
printf(" +%fX^%d",temp->xishu,temp->zhishu);
else if (temp->xishu < 0) //若为负系数
printf("%fX^%d",temp->xishu,temp->zhishu);
temp=temp->Next;
}
}
//多项式的加法计算
void add_poly(Node *pa,Node *pb)//pa,pb分别为多项式一和多项式二的头指针
{
Node *p=pa->Next; //p为遍历指针,此时指向多项式一的第一项
Node *q=pb->Next; //q为遍历指针,此时指向多项式二的第一项
Node *pre=pa; //pre此刻指向多项式一的头指针,后续作为中间载体
Node *u; //u指针做临时指针,用于释放节点
while (p!=NULL&&q!=NULL)//若指针指向的内容都不为空
{
if (p->zhishu > q->zhishu)//若多项式一中的项系数大于对应多项式二中的项
{
pre = p ;
p = p->Next;
}
else if(p->zhishu == q->zhishu)//若两项系数相等则合并同类项
{
float x = p->xishu + q->xishu;//x为合并后的系数
if (x != 0) //若合并后系数不为零
{
p->xishu = x; //将合并后的系数赋给多项式一中对应的项
pre=p; //pre指向p结点
}
else //若合并后系数为零
{
pre->Next = p->Next;//指向下一个结点
free(p); //释放p销毁结点
}
p = pre->Next;
u = q;
q = q->Next;
free(u);
}
else //若多项式一中的项系数小于对应多项式二中的项
{
u = q->Next;
q->Next = p;
pre->Next = q;
pre = q ;
q = u;
}
}
if (q)
{
pre->Next = q;
}
free(pb);
}
//实现主函数
int main()
{
float xishu; //定义变量 系数和指数
int zhishu;
PNode head1 = (PNode)malloc(sizeof(struct Node));
PNode head2 = (PNode)malloc(sizeof(struct Node));
PNode tem=NULL;
head1->Next=NULL;
head2->Next=NULL;
//输入多项式一各项
printf("输入链表一的系数和指数,如:3,2 (以0,0结束输入):\n");
scanf("%f,%d",&xishu,&zhishu);
while (xishu!=0) //当系数为零时停止输入
{
tem=(PNode)malloc(sizeof(struct Node)); //往链表中插入新的项
tem->xishu = xishu;
tem->zhishu = zhishu;
tem->Next = NULL;
insertNewPoint_link(head1,tem); //插入新结点
scanf("%f,%d",&xishu,&zhishu); //输入下一项
}
printf("多项式一为:\n");
printLinkeLink(head1); //输出多项式一
printf("\n");
//输入多项式二各项
printf("\n输入链表二的系数和指数,如:3,2 (以0,0结束输入):\n");
scanf("%f,%d",&xishu,&zhishu);
while (xishu!=0) //当系数为零时停止输入
{
tem=(PNode)malloc(sizeof(struct Node));
tem->xishu=xishu;
tem->zhishu=zhishu;
tem->Next=NULL;
insertNewPoint_link(head2,tem);
scanf("%f,%d",&xishu,&zhishu);
}
printf("多项式二为:\n");
printLinkeLink(head2);
printf("\n");
//输出多项式相加的结果
add_poly(head1,head2);
printf("\n多项式相加后的结果为:\n");
printLinkeLink(head1);
printf("\n\n");
}