算法第二次作业

问题内容

第一行有一个正整数 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 ;
}
原文地址:https://www.cnblogs.com/XINJIUXJ/p/13663319.html