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;
    }
    

      

  • 相关阅读:
    字符编码相关
    函数之形参与实参
    文件操作模式
    函数对象,名称空间,作用域,和闭包
    吴裕雄天生自然SPRINGBOOT开发实战处理'spring.datasource.url' is not specified and no embedded datasource could be autoconfigured
    吴裕雄天生自然SPRINGBOOT开发实战处理XXXX that could not be found.
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot HTML表单登录
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot REST示例
    吴裕雄天生自然SpringBoot开发实战学习笔记处理 Could not write metadata for '/Servers'.metadata\.plugins\org.eclipse.core.resources\.projects\Servers\.markers.snap (系统找不到指定的路径。)
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot Tomcat部署
  • 原文地址:https://www.cnblogs.com/yelir/p/11536019.html
Copyright © 2011-2022 走看看