2. 一元多项式乘法

一元多项式乘法
单点时限: 2.0 sec

内存限制: 256 MB

计算两个一元多项式的乘积。

输入格式
每行两个多项式,以一个空格分隔,多项式格式为 anxn+…+a1x+a0。

每行长度不超过100,0<n<50。

输出格式
每组数据一行,根据次数由高到低顺序输出两个多项式乘积的非零项系数,两个系数之间由一个空格分隔。

样例
input
x+1 x-1
x^2-3x+1 x^3
x+2 2
output
1 -1
1 -3 1
2 4
/这道题代码有点长,花了两个多小时才写出来,处在崩溃的边缘,下面是AC代码,里面有注释/

在这里插入代码片
/*主要还是自己在演草纸上列一下,然后多想想,只要思路不错,代码写出来基本都是对的0.0*/ 
#include<iostream>
#include<algorithm>
#include<string.h>
#include<ctype.h>
using namespace std;

int a[55],b[55],c[105]; //分别用来存放两个输入的方程,和运算之后的方程;下标表示x的指数,对应的值为系数 
int i2i(string str,int s,int e){  //字符串转化为数字 
	int sum=0;
	for(int i=s;i<=e;i++){
		sum = sum*10 + (str[i]-'0');
	}
	return sum;
}
int main()
{
	string s1,s2;
	while(cin>>s1>>s2){
		memset(a,0,sizeof(a));	//初始化数组 
		memset(b,0,sizeof(b));
		memset(c,0,sizeof(c));
		int maxa=0,maxb=0;     //用来记录两个方程的最高次幂 
		int len1 = s1.length();
		int len2 = s2.length();
		if(isdigit(s1[len1-1])&&s1[len1-2]!='^'){    //最后一项如果是常数的话就单独处理 
			int cnt1=0;
			int j=len1-1;
			while(j>=0&&isdigit(s1[j])){
				j--;
				cnt1++;
			}
			if(j>=0&&s1[j] == '-')
			a[0] = -1*i2i(s1,j+1,j+cnt1);
			else
			a[0] = i2i(s1,j+1,j+cnt1);
		}
		if(isdigit(s2[len2-1])&&s2[len2-2]!='^'){
			int cnt2=0;
			int j=len2-1;
			while(j>=0&&isdigit(s2[j])){
				j--;
				cnt2++;
			}
			if(j>=0&&s2[j] == '-')
			b[0] = -1*i2i(s2,j+1,j+cnt2);
			else
			b[0] = i2i(s2,j+1,j+cnt2);
		}
		for(int i=0;i<len1;i++){
			int num=0;  //系数 
			if(s1[i] == 'x'){     //找到x作为分隔点,前面的数字就是系数,'^'后面的数字就是指数 
				int k=i-1;
				if(!isdigit(s1[k])){
					if(k>=0 && s1[k] == '-')
					num=-1;
					else
					num=1;
				}
				if(isdigit(s1[k])){
					while(k>=0&&isdigit(s1[k])){
						k--;
					}
					if(k>=0 && s1[k] == '-')
					num = -1*i2i(s1,k+1,i-1);
					else
					num = i2i(s1,k+1,i-1);
				}
				
				int j=i;
				if(s1[i+1]=='^'){
					int cnt1=0;
					while(isdigit(s1[j+2])){
						cnt1++;j++;
					}
					int pos = i2i(s1,i+2,i+1+cnt1);
					maxa = max(maxa,pos);
					a[pos] = num;
				}
				else{
					maxa = max(maxa,1);
					a[1] = num;
				}
				
			}
		}
		for(int i=0;i<len2;i++){
			int num=0;  //系数 
			if(s2[i] == 'x'){
				int k=i-1;
				if(!isdigit(s2[k])){
					if(k>=0 && s2[k] == '-')
					num=-1;
					else
					num=1;
				}
				if(isdigit(s2[k])){
					while(k>=0&&isdigit(s2[k])){
						k--;
					}
					if(k>=0 && s2[k] == '-')
					num = -1*i2i(s2,k+1,i-1);
					else
					num = i2i(s2,k+1,i-1);
				}
				
				int j=i;
				if(s2[i+1]=='^'){
					int cnt1=0;
					while(isdigit(s2[j+2])){
						cnt1++;j++;
					}
					int pos = i2i(s2,i+2,i+1+cnt1);
					maxb = max(maxb,pos);
					b[pos] = num;
				}
				else{
					maxb = max(maxb,1);
					b[1] = num;
				}
				
			}
		}
		
		for(int i=maxa;i>=0;i--){
			for(int j=maxb;j>=0;j--){
				if(a[i]&&b[j])
				c[i+j] += a[i]*b[j];
			}
		}
		for(int i=maxa+maxb;i>=0;i--)
		if(c[i])
		cout<<c[i]<<" ";
		cout<<endl;
	}
	
	return 0;
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

译制片~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值