zoukankan      html  css  js  c++  java
  • 【luoguP1797】 克鲁斯的加减法_NOI导刊2010提高(05)

    题目描述:

    奶牛克鲁斯认为人类的加法算式太落后了。比如说有时候想要用加法计算+15*3,只能写成+15+15+15,真是浪费精力啊!于是,克鲁斯决定开发出一种新的加法算式。当然新的算式也是建立在原本算式的基础上的,不同就在于上式可以直接写成+++15,当然对于-15*3这样的算式可以写为---15。一段时间后,克鲁斯又被那无穷多个+-号口到了,于是他又将这个算式改进了一下。比如+15*3又可以写成+(3)15,当然,-15*3等价于-(3)15。但是从上面可以看出,对于乘数较小的情况,如+++15这样的表述还是很方便的,于是在新的算式中还是保留了这种丑陋的形式。

    对于算式还要作一点特殊的说明:

    +15*3转换成克鲁斯型算式时可以写成+++15或+(3)15,但不可以写成++(2)15这样的形式。

    对于算式23+15*3-2可以表示为以下几种形式:

    23+++15-2

    23+(3)15-2
    

    +23+++15-2

    +23+(3)15-2
    +(1)23+(3)15-(1)2

    不会出现如下几种形式:

        (1)23+++15-2
        +23++(2)15-(1)2
        23+++15-2+(0)100
        23-(-3)15-2
    
    

    输入格式

    一行,一个克鲁斯型算式。

    输出格式

    一行,为运算结果。

    输入输出样例

    输入 #1
    +(1)23+(3)15-(1)2
    输出 #1
    66

    说明/提示

    对于20%的数据,输入长度不超过10;

    对于100%的数据,输入长度不超过200。

    思路:   这是一道模拟。加上高精度。。调了半个月

          这奶牛有病吧,天天发神经

    代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    char ch[210];
    int a1[2000],a2[2000],sum[2000];//a1,a2暂时储存,sum储存乘出来的值 
    int s[20000],ans[20000];
    int f=1;
    
    //读入 
    inline void read1(int x){
        memset(a1,0,sizeof(a1));
        while(ch[x]<'0'||ch[x]>'9')x++;
        while(ch[x]>='0'&&ch[x]<='9')x++;
        x--;
        while(ch[x]>='0'&&ch[x]<='9')a1[++a1[0]]=ch[x]-'0',x--;
    }
    inline void read2(int x){
        memset(a2,0,sizeof(a2));
        while(ch[x]<'0'||ch[x]>'9')x++;
        while(ch[x]>='0'&&ch[x]<='9')x++;
        x--;
        while(ch[x]>='0'&&ch[x]<='9')a2[++a2[0]]=ch[x]-'0',x--;
    }
    
    //高精乘 
    inline void mul(){
        sum[0]=a1[0]+a2[0]-1;
        for(int j=1;j<=a2[0];j++){
            for(int i=1;i<=a1[0];i++){
                sum[i+j-1]+=a1[i]*a2[j];
                sum[i+j]+=sum[i+j-1]/10;
                sum[i+j-1]%=10;
            }
        }
        if(sum[sum[0]+1]>=1) sum[0]++;
        while(sum[sum[0]]==0&&sum[0]>1)--sum[0];
    }
    
    //高精加 
    inline void add(int a[],int b[]){
        memset(s,0,sizeof(s));
        int len=max(a[0],b[0]);
        int g=0;
        for(int i=1;i<=len;i++){
            s[i]+=a[i]+b[i]+g;
            g=s[i]/10;
            s[i]=s[i]%10;
        }
        if(g)s[++len]=g;
        s[0]=len;
        for(int i=0;i<=len;++i)ans[i]=s[i];
    }
    
    //高精减 
    inline bool com(int a[],int b[]){
        if(a[0]>b[0])return 0;
        if(a[0]<b[0])return 1;
        for(int i=a[0];i>=1;--i){
            if(a[i]<b[i])return 1;
            if(a[i]>b[i])return 0;
        }
        return 0;
    }
    inline void jian(int a[],int b[]){
        if(com(a,b)){
            swap(a,b);
            f=-1;
        }
        else f=1;
        for(int i=1;i<=a[0];++i){
            if(i<=b[0])   //我不知道为啥可能在i<=a[0]&&i>=b[0]的时候b[i]有值
                a[i]-=b[i];
            if(a[i]<0){
                a[i]+=10;
                a[i+1]--;
            }
        }
        while(a[a[0]]==0&&a[0]>1)a[0]--;
        for(int i=0;i<=a[0];++i)
            ans[i]=a[i];
    }
    
    //把int型数拆到数组中 
    inline void dig(int x){
        memset(a1,0,sizeof(a1));
        while(x){
            a1[++a1[0]]=x%10;
            x/=10;
        }
    }
    int main(){
        scanf("%s",ch+1);
        int len=strlen(ch+1);
        for(int i=1;i<=len;++i){
            if(ch[i]=='+'&&ch[i+1]=='('){
                read1(i+2);
                while(ch[i]<'0'||ch[i]>'9')i++;
                while(ch[i]>='0'&&ch[i]<='9')i++;
                i++;
                read2(i);
                mul();
                if(f==1)            //讨论符号,f为1,ans为正,f为-1,ans为负 
                    add(ans,sum);
                else jian(sum,ans);
                memset(sum,0,sizeof(sum));
            }
            else if(ch[i]=='-'&&ch[i+1]=='('){
                read1(i+2);
                while(ch[i]<'0'||ch[i]>'9')i++;
                while(ch[i]>='0'&&ch[i]<='9')i++;
                i++;
                read2(i);
                mul();
                if(f==1)
                    jian(ans,sum);
                else add(ans,sum);
                memset(sum,0,sizeof(sum));
            }
            else if(ch[i]=='+'&&ch[i+1]>='0'&&ch[i+1]<='9'){
                read1(i+1);
                if(f==1)
                add(ans,a1);
                else jian(a1,ans);
            }
            else if(ch[i]=='-'&&ch[i+1]>='0'&&ch[i+1]<='9'){
                read1(i+1);
                if(f==1)jian(ans,a1);
                else add(ans,a1);
            }
            else if(ch[i]=='+'&&ch[i+1]=='+'){
                int cnt=0;
                while(ch[i]=='+')cnt++,i++;
                dig(cnt);
                read2(i);
                mul();
                if(f==1)add(ans,sum);
                else jian(sum,ans);
                memset(sum,0,sizeof(sum));
            }
            else if(ch[i]=='-'&&ch[i+1]=='-'){
                int cnt=0;
                while(ch[i]=='-')cnt++,i++;
                dig(cnt);
                read2(i);
                mul();
                if(f==1)
                    jian(ans,sum);
                else add(ans,sum);
                memset(sum,0,sizeof(sum));
            }
            else if(i==1&&ch[i]>='0'&&ch[i]<='9'){
                read1(i);
                for(int j=0;j<=a1[0];++j)
                    ans[j]=a1[j];
            }
        }
        if(f==-1)printf("-");
        for(int i=ans[0];i>0;--i)
            printf("%d",ans[i]);
        return 0;
    }
    

      

  • 相关阅读:
    7387. 【2021.11.16NOIP提高组联考】数析送命题
    js 数组的基本操作
    界面跳转已打开界面强制刷新
    Topshelf安装Windows服务
    np_utils.to_categorical
    SQLServer数据库的.ldf文件太大怎办?
    Maven报错Please ensure you are using JDK 1.4 or above and not a JRE解决方法!
    [学习笔记]设计模式之Factory Method
    [学习笔记]设计模式之Singleton
    [学习笔记]设计模式之Abstract Factory
  • 原文地址:https://www.cnblogs.com/yelir/p/11536019.html
Copyright © 2011-2022 走看看