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 }