• [DataStructure]多项式加法与乘法--A.数组存储(适用于零元系数少的多项式)


    数据结构大作业……

    发出来大家乐呵乐呵……

    一、问题描述

    给出N个多项式,求他们的和与积

    二、解题报告

    (1)建立存储结构

    1 struct _Poly
    2 {
    3     double Data[MAXTIMES+1];
    4     int Times;
    5 };
    6 struct _Poly Poly[N+1];

    (2)主程序架构

    1 int main()
    2 {
    3      int Sum;
    4      cout<<"请输入要做运算的多项式数量"<<endl;
    5      cin>>Sum;
    6      for (int i=1;i<=Sum;++i)
    7      Input_Poly(i);
    8   return 0;
    9 }

     俗话(WANGJIANDE)说的好,“主程序很短,写起来很爽”

    (3)初始化模块Init_Poly(_Poly Poly0);

    1 void Init_Poly(struct _Poly &Poly)
    2 {
    3     for (int i=0;i<=Poly.Times;++i)
    4         Poly.Data[i]=0;
    5     Poly.Times=0;
    6 }

    (4)输入模块Input_Poly(int i);

     

     1 P.S.对输入的声明
     2 
     3      cout<<"本程序支持两种读入方式,请根据您的需要选择:"<<endl;
     4 
     5      cout<<"1.对于零系数较多的多项式读入方式"<<endl;
     6 
     7      cout<<"  即输入幂次和对应系数,常数项幂次为0,-1为终止标志"<<endl;
     8 
     9      cout<<"2.按照降幂次序输入本多项式的各项系数,"<<endl;
    10 
    11      cout<<"  系数之间用空格隔开,不存在的项请输入0"<<endl;
    12 
    13      cout<<"如对f(x)=x^5+x^2-54x+65,按照两种方法读入样例如下"<<endl;
    14 
    15      cout<<"1.请输入:"<<endl;
    16 
    17      cout<<"         5 1"<<endl;
    18 
    19      cout<<"         2 1"<<endl;
    20 
    21      cout<<"         1 -54"<<endl;
    22 
    23      cout<<"         0 65"<<endl;
    24 
    25      cout<<"         -1"<<endl;
    26 
    27      cout<<"2.次数请输入:5"<<endl;
    28 
    29      cout<<"  系数请输入:1 0 0 1 -54 65"<<endl;
     1 void Input_Poly(int i)
     2 {
     3 /*初始化多项式*/
     4     Poly[i].Times=MAXTIMES;
     5     Init_Poly(Poly[i]);
     6 
     7 /*输入*/
     8     cout<<"即将输入第"<<i<<"个多项式……"<<endl;
     9     int Point;
    10     cout<<"请问您想使用哪种方法读入本多项式?(请输入1或者2)"<<endl;
    11 cin>>Point;
    12     if (Point==2)
    13     {
    14         while (1)
    15         {
    16             cout<<"请输入本多项式的次数"<<endl;
    17             cin>>Poly[i].Times;
    18             if (Poly[i].Times<0) cout<<"Are U Kidding ME?"<<endl;
    19             if (Poly[i].Times<=MAXTIMES) break;//防数组越界
    20             else cout<<"Sorry,The Number is too large!"<<endl;
    21         }
    22         cout<<"请输入本多项式的系数"<<endl;
    23         for (int j=Poly[i].Times;j>=0;--j)
    24             cin>>Poly[i].Data[j];
    25     }
    26     else if (Point==1)
    27     {
    28         int K;
    29         cout<<"请依次输入非零幂次及对应系数,全部输入完成后请输入-1."<<endl;
    30         while (1)
    31         {
    32            cin>>K;
    33            if (K>Poly[i].Times) Poly[i].Times=K;
    34            if (K==-1) break;
    35     /*    if (Poly[i].Times>MAXTIMES)
    36           {
    37               cout<<"Sorry,The Number is too large!I Cannot Solve it."<<endl;
    38               return;
    39           }      */
    40            cin>>Poly[i].Data[K];
    41         }
    42 
    43     }
    44       /*测试输入正确性*/
    45     cout<<"您输入的多项式为:";
    46     Output_Data(Poly[i]);
    47 }

    (5)输出模块Output_Data(_Poly Poly0);

    没什么特别需要说明的,就是判断的各种情况输出。

     1 Void Output_Data(struct _Poly Poly)
     2 {
     3     cout<<"f(x)=";
     4     bool flag=false;///判断是否已经出现过非零输出
     5     /*下输出最高次数项到二次项*/
     6     for (int i=Poly.Times;i>=2;--i)
     7     {
     8         if (fabs(Poly.Data[i])>1e-7)
     9           {
    10               if (!flag)///如果这是第一个输出
    11               {
    12                   if (Poly.Data[i]!=1) cout<<Poly.Data[i];///如果这个系数是1,不需要输出1
    13                   cout<<'x'<<'^'<<i;
    14               }
    15               else if (Poly.Data[i]>0) ///不是第一次输出,正系数前应该有加号
    16                 {
    17                     cout<<'+';
    18                     if (Poly.Data[i]!=1) cout<<Poly.Data[i];
    19                     ///如果这个系数是1,不需要输出1
    20                     cout<<"x^"<<i;
    21                 }
    22               else cout<<Poly.Data[i]<<"x^"<<i;
    23               flag=true;///成功输出过!
    24           }
    25     }/*for*/
    26     /*下输出一次项*/
    27     if (flag && Poly.Data[1]>0) ///如果曾经输出过数字,并且一次项系数为正,需要输出加号
    28     {
    29         cout<<'+';
    30         if (Poly.Data[1]!=1) cout<<Poly.Data[1];
    31         ///如果这个系数是1,不需要输出1
    32         cout<<'x';
    33         flag=true;
    34     }
    35       else if (fabs(Poly.Data[1])>1e-7)///else if (Poly.Data[1]!=0) 此处等价为(Poly.Data[1]<0 || !flag),即非负或者这是第一个可输出系数,只需输出系数即可
    36         {
    37             if (Poly.Data[1]!=1) cout<<Poly.Data[1];
    38             ///如果这个系数是1,不需要输出1
    39             cout<<'x';
    40             flag=true;
    41         }
    42     /*类似一次项,下输出常数项*/
    43     if (Poly.Data[0]>1e-7 && flag )
    44         cout<<'+'<<Poly.Data[0]<<endl;
    45     else if (Poly.Data[0]<-1e-7 || (!flag) )
    46         cout<<Poly.Data[0]<<'*'<<endl;
    47     else if (flag) cout<<endl;
    48 }

    (6)加法模块Init_Poly(_Poly Poly0);

     1 /*------------Sum个多项式相加,答案存储在Ploy0中------------*/
     2 void Plus_Poly(int Sum)
     3 {
     4     struct _Poly Poly0;
     5     Init_Poly(Poly0);
     6     for (int i=1;i<=Sum;++i)
     7         if (Poly[i].Times>Poly0.Times)
     8             Poly0.Times=Poly[i].Times; ///寻找最大次数
     9     for (int i=1;i<=Sum;++i)
    10       for (int j=0;j<=Poly0.Times;++j)
    11          Poly0.Data[j]+=Poly[i].Data[j];///多项式系数相加,得到最终答案
    12     cout<<"和为:";
    13     Output_Data(Poly0);
    14 } 

    (7)乘法模块Multiply_Poly(int Sum);

     1 /*------------Sum个多项式相乘,答案存储在Ploy0中------------*/
     2 void Multiply_Poly(int Sum)
     3 {
     4    struct _Poly Poly0;//临时空间Poly0存放结果
     5    Poly0=Poly[1];
     6    //Output_Data(Poly0); //TEST
     7    struct _Poly PolyTmp;
     8    for (int i=2;i<=Sum;++i)
     9    {
    10       Init_Poly(PolyTmp);
    11       PolyTmp.Times=Poly0.Times+Poly[i].Times;///Poly的最高次项系数一定不减少
    12       // Output_Data(PolyTmp);
    13       for (int j=Poly[i].Times;j>=0;--j)///第i个多项式的各项
    14          for (int k=Poly0.Times;k>=0;--k)///Answer多项式的各项
    15             {
    16                  // cout<<j+k<<'='<<PolyTmp.Data[j+k]<<endl;
    17                   PolyTmp.Data[j+k]+=Poly[i].Data[j]*Poly0.Data[k];///Ax^b*Cx^d=(A*C)x^(b+d)
    18                 //cout<<Poly[i].Data[j]<<'*'<<Poly0.Data[k]<<'='<<PolyTmp.Data[j+k]<<"x^"<<j+k<<endl;
    19             }/*for j&k*/
    20        Poly0=PolyTmp;//Poly0
    21    }/*for i*/
    22    cout<<"积为:";
    23    Output_Data(Poly0);
    24 }
    25

     (8)完整代码

      1 /*0
      2    By
      3      Iris.Catch-22.S、`
      4      Dept. of Mathematics,
      5      School of Science,
      6      HIT
      7    November,2015
      8 */
      9 #define MAXTIMES 101
     10 #define N 10
     11 #include<iostream>
     12 #include<cmath>
     13 using namespace std;
     14 
     15 void CopyRight()
     16 {
     17    cout<<"---------By ICS,HIT,2015/11----------"<<endl;
     18    cout<<"--------多项式加法、乘法计算---------"<<endl;
     19    cout<<"--------------Ver 0.9.2------------"<<endl;
     20 
     21 }
     22 
     23 struct _Poly
     24 {
     25     double Data[MAXTIMES+1];
     26     int Times;
     27 };
     28 struct _Poly Poly[N+1];
     29 
     30 /*---------------------多项式初始化---------------------*/
     31 void Init_Poly(struct _Poly &Poly)
     32 {
     33     for (int i=0;i<=Poly.Times;++i)
     34         Poly.Data[i]=0;
     35     Poly.Times=0;
     36 }
     37 /*-----------------------输出模块-----------------------*/
     38 void Output_Data(struct _Poly Poly)
     39 {
     40     cout<<"f(x)=";
     41     bool flag=false;///判断是否已经出现过非零输出
     42     /*下输出最高次数项到二次项*/
     43     for (int i=Poly.Times;i>=2;--i)
     44     {
     45         if (fabs(Poly.Data[i])>1e-7)
     46           {
     47               if (!flag)///如果这是第一个输出
     48               {
     49                   if (Poly.Data[i]!=1) cout<<Poly.Data[i];///如果这个系数是1,不需要输出1
     50                   cout<<'x'<<'^'<<i;
     51               }
     52               else if (Poly.Data[i]>0) ///不是第一次输出,正系数前应该有加号
     53                 {
     54                     cout<<'+';
     55                     if (Poly.Data[i]!=1) cout<<Poly.Data[i];
     56                     ///如果这个系数是1,不需要输出1
     57                     cout<<"x^"<<i;
     58                 }
     59               else cout<<Poly.Data[i]<<"x^"<<i;
     60               flag=true;///成功输出过!
     61           }
     62     }/*for*/
     63     /*下输出一次项*/
     64     if (flag && Poly.Data[1]>0) ///如果曾经输出过数字,并且一次项系数为正,需要输出加号
     65     {
     66         cout<<'+';
     67         if (Poly.Data[1]!=1) cout<<Poly.Data[1];
     68         ///如果这个系数是1,不需要输出1
     69         cout<<'x';
     70         flag=true;
     71     }
     72       else if (fabs(Poly.Data[1])>1e-7)///else if (Poly.Data[1]!=0) 此处等价为(Poly.Data[1]<0 || !flag),即非负或者这是第一个可输出系数,只需输出系数即可
     73         {
     74             if (Poly.Data[1]!=1) cout<<Poly.Data[1];
     75             ///如果这个系数是1,不需要输出1
     76             cout<<'x';
     77             flag=true;
     78         }
     79     /*类似一次项,下输出常数项*/
     80     if (Poly.Data[0]>1e-7 && flag )
     81         cout<<'+'<<Poly.Data[0]<<endl;
     82     else if (Poly.Data[0]<-1e-7 || (!flag) )
     83         cout<<Poly.Data[0]<<'*'<<endl;
     84     else if (flag) cout<<endl;
     85 }
     86 /*------------------输入多项式模块-----------------*/
     87 void Input_Poly(int i)
     88 {
     89     /*初始化多项式*/
     90     Poly[i].Times=MAXTIMES;
     91     Init_Poly(Poly[i]);
     92     /*输入*/
     93     cout<<"即将输入第"<<i<<"个多项式……"<<endl;
     94     int Point;
     95     cout<<"请问您想使用哪种方法读入本多项式?(请输入1或者2)"<<endl;
     96     cin>>Point;
     97     if (Point==2)
     98     {
     99         while (1)
    100         {
    101             cout<<"请输入本多项式的次数"<<endl;
    102             cin>>Poly[i].Times;
    103             if (Poly[i].Times<0) cout<<"Are U Kidding ME?"<<endl;
    104             if (Poly[i].Times<=MAXTIMES) break;//防数组越界
    105             else cout<<"Sorry,The Number is too large!"<<endl;
    106         }
    107         cout<<"请输入本多项式的系数"<<endl;
    108         for (int j=Poly[i].Times;j>=0;--j)
    109             cin>>Poly[i].Data[j];
    110     }
    111     else if (Point==1)
    112     {
    113         int K;
    114         cout<<"请依次输入非零幂次及对应系数,全部输入完成后请输入-1."<<endl;
    115         while (1)
    116         {
    117            cin>>K;
    118            if (K>Poly[i].Times) Poly[i].Times=K;
    119            if (K==-1) break;
    120     /*    if (Poly[i].Times>MAXTIMES)
    121           {
    122               cout<<"Sorry,The Number is too large!I Cannot Solve it."<<endl;
    123               return;
    124           }      */
    125            cin>>Poly[i].Data[K];
    126         }
    127 
    128     }
    129       /*测试输入正确性*/
    130     cout<<"您输入的多项式为:";
    131     Output_Data(Poly[i]);
    132 }
    133 
    134 /*------------Sum个多项式相乘,答案存储在Ploy0中------------*/
    135 void Multiply_Poly(int Sum)
    136 {
    137    struct _Poly Poly0;
    138    Poly0=Poly[1];
    139    //Output_Data(Poly0); //TEST
    140    struct _Poly PolyTmp;
    141    for (int i=2;i<=Sum;++i)
    142    {
    143       Init_Poly(PolyTmp);
    144       PolyTmp.Times=Poly0.Times+Poly[i].Times;///Poly的最高次项系数一定不减少
    145       //cout<<"HAHAHA"<<endl;Output_Data(PolyTmp);
    146       for (int j=Poly[i].Times;j>=0;--j)///第i个多项式的各项
    147          for (int k=Poly0.Times;k>=0;--k)///Answer多项式的各项
    148             {
    149                  // cout<<j+k<<'='<<PolyTmp.Data[j+k]<<endl;
    150                   PolyTmp.Data[j+k]+=Poly[i].Data[j]*Poly0.Data[k];///Ax^b*Cx^d=(A*C)x^(b+d)
    151                   //cout<<Poly[i].Data[j]<<'*'<<Poly0.Data[k]<<'='<<PolyTmp.Data[j+k]<<"x^"<<j+k<<endl;
    152             }/*for j&k*/
    153        Poly0=PolyTmp;//Poly0
    154    }/*for i*/
    155    cout<<"积为:";
    156    Output_Data(Poly0);
    157 }
    158 /*------------Sum个多项式相加,答案存储在Ploy0中------------*/
    159 void Plus_Poly(int Sum)
    160 {
    161     struct _Poly Poly0;
    162     Init_Poly(Poly0);
    163     for (int i=1;i<=Sum;++i)
    164         if (Poly[i].Times>Poly0.Times)
    165             Poly0.Times=Poly[i].Times; ///寻找最大次数
    166     for (int i=1;i<=Sum;++i)
    167       for (int j=0;j<=Poly0.Times;++j)
    168          Poly0.Data[j]+=Poly[i].Data[j];///多项式系数相加,得到最终答案
    169     cout<<"和为:";
    170     Output_Data(Poly0);
    171 }
    172 
    173 
    174 /*--------------------任务模块--------------------*/
    175 void Taskmgr(int Sum)
    176 {
    177   int flag=1;
    178   while (1)
    179     {
    180       cout<<"请问您要进行求和还是求积?"<<endl;
    181       cout<<"求和请输入1,求积请输入2,均求请输入3"<<endl;
    182       cin>>flag;
    183       if (flag==1)
    184         {
    185           Plus_Poly(Sum);///+
    186           break;
    187         }
    188         else if (flag==2)
    189           {
    190              Multiply_Poly(Sum);///*
    191              break;
    192           }
    193         else if (flag==3)
    194           {
    195              Plus_Poly(Sum);///+
    196              Multiply_Poly(Sum);///*
    197              break;
    198           }
    199       else ///Error
    200           cout<<"输入有误,请重新输入!"<<endl;
    201     }
    202 }
    203 int main()
    204 {
    205    CopyRight();
    206    while (1)
    207    {
    208      int Sum;
    209      /*预处理输入*/
    210      cout<<"请输入要做运算的多项式数量"<<endl;
    211      cin>>Sum;
    212      cout<<"本程序支持两种读入方式,请根据您的需要选择:"<<endl;
    213      cout<<"1.对于零系数较多的多项式读入方式"<<endl;
    214      cout<<"  即输入幂次和对应系数,常数项幂次为0,-1为终止标志"<<endl;
    215      cout<<"2.按照降幂次序输入本多项式的各项系数,"<<endl;
    216      cout<<"  系数之间用空格隔开,不存在的项请输入0"<<endl;
    217      cout<<"如对f(x)=x^5+x^2-54x+65,按照两种方法读入样例如下"<<endl;
    218      cout<<"1.请输入:"<<endl;
    219      cout<<"         5 1"<<endl;
    220      cout<<"         2 1"<<endl;
    221      cout<<"         1 -54"<<endl;
    222      cout<<"         0 65"<<endl;
    223      cout<<"         -1"<<endl;
    224      cout<<"2.次数请输入:5"<<endl;
    225      cout<<"  系数请输入:1 0 0 1 -54 65"<<endl;
    226      for (int i=1;i<=Sum;++i)
    227      Input_Poly(i);
    228      /*任务模块*/
    229      Taskmgr(Sum);
    230      /*连续计算设置*/
    231      cout<<"您是否想继续计算?是请输入Y,否则请输入N"<<endl;
    232      char Flag;
    233      cin>>Flag;
    234      if (Flag!='Y')
    235      {
    236          cout<<"Thank You!"<<endl;
    237          break;
    238      }
    239     }
    240    return 0;
    241 }

    ---Done By Iris.Catch-22.S、`

    这个A版完全是水出来的……我主要功夫花在输入输出的修正上了。然而一坨if还是很讨人厌、

    没有比数组更自然、更简便的存储结构了、、、

    链表是逻辑自然书写不自然……

    嗯、下一个B版是链表的

  • 相关阅读:
    騎士宣言
    [洛谷P1631] 序列合并
    [HNOI2006]公路修建问题
    [洛谷2068] 统计和
    [洛谷P1168] 中位数
    【模板】可持久化数组(可持久化线段树/平衡树)
    【模板】可持久化线段树 1(主席树)
    [JSOI2008]最大数maxnumber
    NOI导刊2010提高(06) 黑匣子
    [洛谷1533] 可怜的狗狗
  • 原文地址:https://www.cnblogs.com/Catch-22/p/5092685.html
Copyright © 2020-2023  润新知