问题内容
第一行有一个正整数 k,表示有 k 个一元实系数多项式。接下来有 k(k<=20)个数据块,每个数据块的第 1行是 1 个正整数 s,表示该数据块共有 s行。接下来的 s 行中,每行由实数 a和整数 b组成,表示多项式中的项
紧接着 k 个数据块的是长度为 k-1 的字符串,每个字符是“+”,“-”,“*”这 3 个字符之一。
★数据输出:
文件的第一行是计算得到的多项式 g(x),输出多项式时,用 x^k 表示应表示为 5x^5。注意输出的结果应该符合数学中手写习惯。例如,x不应输出为 1x^1,实系数 保留 6位有效数字。(数据保证多项式项数不大于 500)
★补充说明
整数 b 满足 b 为非负整数
输出的多项式结果,按项的幂次从高到低排序,参见样例
★Hint
c++中可以使用 setprecision 操作符来控制显示浮点数值的有效数的数量
输入示例
输入示例1
2
4
-1 4
8.75 3
0.5556666 2
1234.456 1
1
6007.0012 0
+
输出示例1
-x4+8.75x3+0.555667x^2+1234.46x+6007
输入示例2
3
3
3 3
4 1
6 0
2
6 2
1 0
1
3 1
+*
输出示例2
9x4+18x3+12x^2+21x
整体思路
因为我链表太菜了,所以决定开一个二维数组将所有多项式的数据存起来,用下标表示多项式某一项的次数。
然后就是不停的写写改改,但这个方法也有很大的不足,因为如果指数过大就无法存进数组中。
我的代码
#include<iostream>
using namespace std;
double num[21][502]={0};
void add(int a){ //加法
int j;
for(j=0;j<502;j++){
num[20][j]=num[20][j]+num[a+1][j];
}
}
void re(int a){ //减法
int j;
for(j=0;j<502;j++){
num[20][j]=num[20][j]-num[a+1][j];
}
}
void mul(int a){ //乘法
int j,l;
double n[502]={0};
for(j=0;j<502;j++){
if(num[20][j])
for(l=0;l<501;l++)
if(num[a+1][l])
n[l+j]+=num[20][j]*num[a+1][l];
}
for(j=0;j<502;j++){
num[20][j]=n[j];
}
}
void show(){ //最终输出
int j,s=0; //注意将s初始化为0,否则s的数值未知,下面for循环判断时如果全是0,那么s的值不定就会导致程序错误
for(j=0;j<502;j++){
if(num[20][j]!=0){
s=j;
}
}
if(s!=0&&s!=1){
if(num[20][s]==1)
cout<<"x^"<<s;
if(num[20][s]!=1&&num[20][s]!=-1)
cout<<num[20][s]<<"x^"<<s;
if(num[20][s]==-1)
cout<<"-x^"<<s;
}
if(s==0)
cout<<num[20][s];
if(s==1){
if(num[20][s]==1)
cout<<"x";
if(num[20][s]==-1)
cout<<"-x";
if(num[20][s]!=1&&num[20][s]!=-1)
cout<<num[20][s]<<"x";
}
for(j=s-1;j>=0;j--){
if(num[20][j]>0&&num[20][j]!=1){
if(j!=1&&j!=0)
cout<<"+"<<num[20][j]<<"x^"<<j;
if(j==1)
cout<<"+"<<num[20][j]<<"x";
if(j==0)
cout<<"+"<<num[20][j];
}
if(num[20][j]==1){
if(j==1){
cout<<"+x";
}
if(j==0)
cout<<"+1";
if(j!=0&&j!=1)
cout<<"+x^"<<j;
}
if(num[20][j]<0&&num[20][j]!=-1){
if(j!=1&&j!=0)
cout<<num[20][j]<<"x^"<<j;
if(j==1)
cout<<num[20][j]<<"x";
if(j==0)
cout<<num[20][j];
}
if(num[20][j]==-1){
if(j==1){
cout<<"-x";
}
if(j==0)
cout<<"-1";
if(j!=0&&j!=1)
cout<<"-x^"<<j;
}
}
}
int main(){
int k,i,s[21]={0},z;
double x;
char sym[21];
cin>>k;
for(i=0;i<k;i++){
cin>>s[i];
for(int j=0;j<s[i];j++){
cin>>x>>z;
num[i][z]=x;
}
}
for(i=0;i<k-1;i++)
cin>>sym[i];
for(int j=0;j<502;j++)
num[20][j]=num[0][j];
for(i=0;i<k-1;i++){
if(sym[i]=='+')
add(i);
if(sym[i]=='-')
re(i);
if(sym[i]=='*')
mul(i);
}
show();
return 0 ;
}