标签:
数据结构大作业……
发出来大家乐呵乐呵……
一、问题描述
给出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版是链表的
[DataStructure]多项式加法与乘法--A.数组存储(适用于零元系数少的多项式)
标签:
原文地址:http://www.cnblogs.com/Catch-22/p/5092685.html