[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版是链表的

 

posted @ 2015-12-31 21:36  Iris.Catch-22.S、`  阅读(272)  评论(0编辑  收藏  举报