zznu-oj-2134- 发红包!!!-【多项式加法,模拟题目】

2134: 发红包!!!

题目描述

给你两个最简多项式,请输出两个多项式相加后的结果。
给定的多项式的格式为ax
^num1+bx^num2+...其中x前面的a,b代表系数num代表指数(次方数),输入按照多项式的指数从高到低,
输入的x项系数不包含前导0,系数为整数,系数的绝对值小于等于200,指数为正数且指数小于等于200。 输入 第一行一个case代表测试实例(
case<=10) 第二行一个字符串,代表第一个最简多项式。 第三行一个字符串,代表第二个最简多项式。 输出 一个字符串,代表相加后的最简多项式。 样例输入(新加了几组样例,基本涵盖了所有的后台样例) 1 2x^3+3x+5 4x^2-2x
0 0
-9 8
922 -81
x^2 1x^55
2x^2+x+32 12
x^12 32
-x^3 x^2
样例输出 2x
^3+4x^2+x+5

大致思路:

  暴力模拟,先整体把字符串逐个处理成仅包含前缀系数a和幂的b ,然后存进ans[ 幂数 ] =前缀系数 的ans数组中,最后注意“-1”和“1”的前缀系数!

  1 #include <iostream>
  2 #include<stdio.h>
  3 #include<string.h>
  4 #include<string>
  5 #include<algorithm>
  6 #include<vector>
  7 #include<queue>
  8 #include<math.h>
  9 #include<map>
 10 #include<set>
 11 #define ll long long
 12 using namespace std;
 13 #define N 1000008
 14 #define lson rt<<1
 15 #define rson rt<<1|1
 16 struct node{
 17     ll a,b;
 18 }p[N];
 19 ll ans[N];
 20 int cnt; //表示个数
 21 
 22 char s1[N],s2[N];
 23 void cul(char s[]){
 24     int len=strlen(s);
 25     for(int i=0;i<len;){  //挖掘ax^b+
 26           ll op=1;
 27         if(s[i]=='+'){
 28             i++;
 29         }
 30         else if(s[i]=='-'){
 31              op=-1;
 32              i++;
 33 
 34         }
 35 
 36         int a=0,b=0;
 37         bool f=0,g=0;
 38 
 39 
 40         while(i<len&&s[i]!='+'&&s[i]!='-'){
 41             if(s[i]=='x'){
 42                 i++;
 43                 f=1;
 44                 continue;
 45             }
 46 
 47 
 48             if(f==0&&s[i]>='0'&&s[i]<='9'){
 49                 a=a*10+s[i]-'0';
 50             }
 51             else if(f==1&&s[i]>='0'&&s[i]<='9'){
 52 
 53                   b=b*10+s[i]-'0';
 54                   g=1;
 55             }
 56             i++;
 57         }
 58         a*=op;
 59         if(f==1&&a==0)a=1*op;
 60         if(f==1&&b==0&&g==0)b=1;
 61 
 62 
 63         p[++cnt].a=a;
 64         p[cnt].b=b;
 65     }
 66 
 67 }
 68 void debug(){
 69 
 70     for(int i=1;i<=cnt;i++)
 71         printf("【【【 %lldx^%lld
",p[i].a,p[i].b);
 72 }
 73 int main(){
 74 
 75     int T;
 76     scanf("%d",&T);
 77     for(int t=1;t<=T;t++){
 78         scanf("%s%s",s1,s2);
 79         cnt=0;
 80         cul(s1);
 81         cul(s2);
 82 
 83     //    debug();    //调试函数
 84      //   printf("%lld %lld
",p[1].a,p[1].b);
 85     //    printf("%lld %lld
",p[2].a,p[2].b);
 86 
 87         memset(ans,0,sizeof(ans));
 88 
 89         for(int i=0;i<=cnt;i++){
 90             ans[p[i].b]+=p[i].a ;
 91         }
 92 
 93         int f=0;
 94         for(int i=200;i>=0;i--){ //遍历次方数
 95 
 96             if(ans[i]!=0){
 97                 if(!f&&i==0){  //对最后零项(特殊处理)
 98                     if(ans[0]!=0){
 99                        // if(ans[i]>0)cout<<"+";
100                         printf("%lld",ans[i]);
101                         f=1;
102                     }
103                     break;
104                 }
105                 else if(i==0){
106                     if(ans[0]!=0){
107                         if(ans[i]>0)cout<<"+";
108                         printf("%lld",ans[i]);
109                         f=1;
110                     }
111                     break;
112                 }
113 
114                 if(!f){
115                      f=1;
116                      if(ans[i]!=1&&ans[i]!=-1)cout<<ans[i];
117                      else if(ans[i]==-1)cout<<"-";
118 
119                      if(i==1)cout<<"x";
120                      else if(i>1)
121                         cout<<"x^"<<i;
122 
123                 }
124                 else{
125                        if(ans[i]>0) cout<<"+";
126 
127                        if(ans[i]!=1&&ans[i]!=-1)cout<<ans[i];
128                        else if(ans[i]==-1)cout<<"-";
129 
130                        if(i==1)cout<<"x";
131                      else if(i>1)
132                         cout<<"x^"<<i;
133                 }
134             }
135         }
136         if(f==0)cout<<"0";
137         cout<<endl;
138     }
139 
140     return 0;
141 }
View Code(面向后台数据编程)
原文地址:https://www.cnblogs.com/zhazhaacmer/p/9440770.html