题目描述:

奶牛克鲁斯认为人类的加法算式太落后了。比如说有时候想要用加法计算+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;
}

  

【luoguP1797】 克鲁斯的加减法_NOI导刊2010提高(05)的更多相关文章

  1. P1799 数列_NOI导刊2010提高(06)

    P1799 数列_NOI导刊2010提高(06)f[i][j]表示前i个数删去j个数得到的最大价值.if(i-j==x) f[i][j]=max(f[i][j],f[i-1][j]+1); else ...

  2. P1771 方程的解_NOI导刊2010提高(01)

    P1771 方程的解_NOI导刊2010提高(01) 按题意用快速幂把$g(x)$求出来 发现这不就是个组合数入门题吗! $k$个人分$g(x)$个苹果,每人最少分$1$个,有几种方法? 根据插板法, ...

  3. 【洛谷】【堆】P1801 黑匣子_NOI导刊2010提高(06)

    [题目描述:] Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两 ...

  4. 洛谷 P1777 帮助_NOI导刊2010提高(03) 解题报告

    P1777 帮助_NOI导刊2010提高(03) 题目描述 Bubu的书架乱成一团了!帮他一下吧! 他的书架上一共有n本书.我们定义混乱值是连续相同高度书本的段数.例如,如果书的高度是30,30,31 ...

  5. P1776 宝物筛选_NOI导刊2010提高(02)&& 多重背包二进制优化

    多重背包, 要求 \(N\log N\) 复杂度 Solution 众所周和, \(1-N\) 之内的任何数可以由 \(2^{0}, 2^{1}, 2^{2} ... 2^{\log N}, N - ...

  6. P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  7. Luogu P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  8. P1794 装备运输_NOI导刊2010提高(04)

    P1794 装备运输_NOI导刊2010提高(04) 题目描述 德国放松对英国的进攻后,把矛头指向了东边——苏联.1943年初,东线的战斗进行到白热化阶段.据可靠情报,90余万德国军队在库尔斯克准备发 ...

  9. 洛谷—— P1775 古代人的难题_NOI导刊2010提高(02)

    P1775 古代人的难题_NOI导刊2010提高(02) 题目描述 门打开了,里面果然是个很大的厅堂.但可惜厅堂内除了中央的一张羊皮纸和一支精致的石笔,周围几具骷髅外什么也没有.难道这就是王室的遗产? ...

随机推荐

  1. 15.Ansible安装与配置简单版

    Ansible是一个简单高效的自动化运维管理工具,用Python开发,能大批量管理N多台机器,可以并发的在多台机器上部署应用.安装软件.执行命令.配置和编排任务. 一.Ansible工作机制 从图中可 ...

  2. JWT与Session比较和作用

    1. JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该 ...

  3. ReLeQ:一种自动强化学习的神经网络深度量化方法

    ReLeQ:一种自动强化学习的神经网络深度量化方法     ReLeQ:一种自动强化学习的神经网络深度量化方法ReLeQ: An Automatic Reinforcement Learning Ap ...

  4. [Tarjan系列] 无向图e-DCC和v-DCC的缩点

    上一篇讲了如何应用Tarjan算法求出e-DCC和v-DCC. 那么这一篇就是e-DCC和v-DCC的应用之一:缩点. 先讲e-DCC的缩点. 我们把每一个e-DCC都看成一个节点,把所有桥边(x,y ...

  5. luogu1156垃圾陷阱题解--背包DP

    题目链接 https://www.luogu.org/problemnew/show/P1156 方法1 分析 将已经爬的高度看作背包容积,最大剩余血量看作价值,\(f[i][j]\)表示吃完第\(i ...

  6. ubuntu目录结构(转)

    /:根目录,一般根目录下只存放目录,不要存放文件,/etc./bin./dev./lib./sbin应该和根目录放置在一个分区中 /bin:/usr/bin:可执行二进制文件的目录,如常用的命令ls. ...

  7. js之数据类型(对象类型——单体内置对象——JSON)

    JSON(Java Script Object Notation)使用JavaScript语法,是用于存储和传输数据的格式,通常用于服务端向网页传递数据.JSON格式仅仅是一个文本,文本可以被任何编程 ...

  8. ES6中map数据结构学习

    在项目中遇到一个很恶心的需求,然后发现ES6中的map可以解决,所以简单学习了一下map. Javascript的Object本身就是键值对的数据结构,但实际上属性和值构成的是“字符串-值”对,属性只 ...

  9. DS1302时钟

    采用串行数据传送方式,SPI 3线接口 SPI总线 SPI接口是以主从方式工作的,通常有一个主器件和一个或多个从器件 MOSI – 主器件数据输出,从器件数据输入 MISO – 主器件数据输入,从器件 ...

  10. 16.SpringMVC核心技术-文件上传

    上传单个文件 1.定义具有文件上传功能的页面 index.jsp,其表单的设置需要注意,method 属性为 POST, enctype 属性为 multipart/form-data.另外,需要注意 ...