7-2 一元多项式的乘法与加法运算 (20分)

纯模拟法:模拟手工求法 

#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#define Maxsize 1001

using namespace std;

typedef struct Mul{
    //指数
    int index[Maxsize];
    //系数
    int coefficient[Maxsize];
    //项数
    int n;
}Mul,*Mulp;


//交换
void exchange(int &a,int &b){
    a = a^b;
    b = a^b;
    a = a^b;
}


//按指数排序
void sortMul(Mulp n){
    for(int i = 0 ; i<n->n ;i++)
        for(int j = i;j<n->n ;j++){
            if(n->index[i]<n->index[j]){
                exchange(n->index[i],n->index[j]);
                exchange(n->coefficient[i],n->coefficient[j]);
            }
    }
}




//addition
void add(Mulp n1,Mulp n2,Mulp n3){
    int i = 0;
    int j = 0;
    int z = 0;
    int index,coefficient;
    //基于合并思想
    while(i<n1->n&&j<n2->n){
        //相等则合并
        if(n1->index[i]==n2->index[j]){
           index = n1->index[i];
            coefficient = n1->coefficient[i]+n2->coefficient[j];
            i++;
            j++;
        }else if(n1->index[i]>n2->index[j]){
               index = n1->index[i];
               coefficient = n1->coefficient[i];
                i++;
        }else{
                index = n2->index[j];
                coefficient = n2->coefficient[j];
                j++;
            }
        n3->index[z] = index;
        n3->coefficient[z++] = coefficient;
    }
    //将长的往后赋值
    while(i<n1->n){
        n3->index[z] = n1->index[i];
        n3->coefficient[z++] = n1->coefficient[i++];
    }
    while(j<n2->n){
        n3->index[z] = n2->index[j];
        n3->coefficient[z++] = n2->coefficient[j++];
    }
    n3->n = z;
}


//multiplication
void multiply(Mulp n1,Mulp n2,Mulp n3){
    int z = 0;
    int index;
    int coefficient;
    int flag;
    for(int i = 0; i<n1->n; i++){
           for(int j = 0; j<n2->n; j++){
                index = n1->index[i]+n2->index[j];
                coefficient = n1->coefficient[i]*n2->coefficient[j];
                flag = 0;
                //合并同类项
                for(int k = z ; k>=0 ; k--){
                     if(index==n3->index[k]&&index!=0){
                        n3->coefficient[k]+=coefficient;
                        n3->index[k] = index;
                        flag = 1;
                        break;
                    }
                }//无同类项
                if(!flag){
                     n3->index[z] = index;
                     n3->coefficient[z++] = coefficient;
                }
          }
    }
     n3->n = z;
     //按指数排序
     sortMul(n3);
}


//input
void inputNode(Mulp node,int n){
    //cout<<"n: "<<n<<endl;
    node->n = n;
    for(int i = 0 ;i<n ;i++)
        cin>>node->coefficient[i]>>node->index[i];
}


//show
void showNodes(Mulp node){
      int k = 0;
    for(int i = 0 ; i<node->n ;i++){
        //避免输出系数为0项
        if(node->coefficient[i]==0)
            continue;
        if(k)
            cout<<" "<<node->coefficient[i]<<" "<<node->index[i];
        else
            cout<<node->coefficient[i]<<" "<<node->index[i];
        k++;
    }
    //如果所有的系数都为0
    if(k==0)
        cout<<"0 0";
    cout<<endl;
}



int main(){
    Mulp node1 = (Mulp)malloc(sizeof(struct Mul));
    Mulp node2 = (Mulp)malloc(sizeof(struct Mul));
    Mulp node3 = (Mulp)malloc(sizeof(struct Mul));
    int n;
    cin>>n;
    inputNode(node1,n);
    cin>>n;
    inputNode(node2,n);
    multiply(node1,node2,node3);
    showNodes(node3);
    add(node1,node2,node3);
    showNodes(node3);
   return 0;
}

桶排思想:借助数组下标实现同类项合并与排序

#include <iostream>
#include <cstring>

using namespace std;

struct node{
    int a, p;
};

struct node n[1000], m[1000];
int sum[2005];
int mul[4005];

int main(){
    int x, y, k;
    memset(sum, 0, sizeof(sum));
    memset(mul, 0, sizeof(mul));
    cin >> x;
    //将第1个多项式放到n中
    //sum用于存和,偏移1000用于存放负数,下标:指数,内容:系数
    for (int i = 0; i < x; i++)    {
        cin >> n[i].a >> n[i].p;
        sum[n[i].p + 1000] += n[i].a;
    }

    cin >> y;
    //第二个式子输入时顺便求和
    //将第2个式子放到m中
    for (int i = 0; i < y; i++) {
        cin >> m[i].a >> m[i].p;
        sum[m[i].p + 1000] += m[i].a;
    }
    //求和,乘法时偏移2000
    for (int i = 0; i < x; i++)
        for (int j = 0; j < y; j++)
            mul[n[i].p + m[j].p + 2000] += n[i].a * m[j].a;

    //控制乘积中抵消项的情况
    k = 0;

    for (int i = 4000; i >= 0; i--)
        if (mul[i] != 0){
            if (k == 0)
                cout << mul[i] << " " << i - 2000;
            else
                cout << " " << mul[i] << " " << i - 2000;
            k++;
        }

    if (k == 0)
        cout << "0 0";

    cout << endl;

    //加和
    k = 0;

    for (int i = 2000; i >= 0; i--)
        if (sum[i] != 0) {
            if (k == 0)
                cout << sum[i] << " " << i - 1000;
            else
                cout << " " << sum[i] << " " << i - 1000;
            k++;
        }

    if (k == 0)
        cout << "0 0";

    return 0;
}


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值