• 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(面向后台数据编程)
  • 相关阅读:
    Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'.
    Qt 下快速读写Excel指南(尘中远)
    QT 那些事
    安卓环境下,通过QT调用jar包
    android使用C/C++调用SO库
    雷军曾定下目标,2017年将聚焦5大核心战略,分别是:黑科技、新零售、国际化、人工智能和互联网金融五大部分
    Maven和Gradle
    链接生成接口
    孤儿进程和僵尸进程
    Case when 的使用方法
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/9440770.html
Copyright © 2020-2023  润新知