题目描述:

奶牛克鲁斯认为人类的加法算式太落后了。比如说有时候想要用加法计算+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. CentOS7 PHP cURL errno 35, 原因:CentOS7中没有安装curl和OpenSSL的最新版

    安装OpenSSL的最新版 话不多说,直接上安装步骤 #cd /usr/local/src # 跳过证书获取失败 # wget https://www.openssl.org/source/opens ...

  2. 适合新手的160个creakme(二)

    先跑一下,然后找出关键字符串 关键字符串是You Get Wrong和Try Again,不过IDA好像识别不出来这个字符串,在Ollydbg中右键Search For,寻找所有字符串,可以找到这些字 ...

  3. 不吹不黑,赞一下应用运维管理的cassacdra

    不吹不黑的为菊厂的应用运维管理AOM点个赞.Why? 某菊厂应用运维管理工具AOM每天处理着亿级条数据,这么多数据是怎么存储的呢? 说到数据存储就会想到关系型数据库,比如mysql,oracle,sy ...

  4. C#从服务器下载文件的四种方式

    //方法一:TransmitFile实现下载 string fileName = "ss.docx"; //客户端预设的文件名,导出时可修改  string filePath = ...

  5. CORE EF生成ORACLE数据库模型报错问题记录

    需求:最近在新开发一套在LINUX运行的API接口,需要用到net core api框架以及oracle数据库,首先需要解决的就是连接数据库问题,由于是DBFirst 加上之前很多老表不规范,导致了c ...

  6. Idea+Maven部署打包JavaFX项目遇到的坑

    用Idea写了一个JavaFX项目,创建artifacts,build artifacts,运行build出来的exe可执行文件时总是遇到 class not found的错误,如下图 一开始根据提示 ...

  7. PHP 多维数组将下标从0开始

    点击链接加入群[php/web 学习课堂]:https://jq.qq.com/?_wv=1027&k=5645xiw 欢迎大家加入,一起讨论学习 模拟一个: public function ...

  8. docker-compose deploy replicaSet in standalone MongoDB cluster and with auth

    经过两天的折腾,终于实现了自己想要的效果,就是通过docker-compose 部署最新的mongodb replicaSet, 主要是为了测试 4.2 最新的多文档事务,下面将整个步骤分享一下: d ...

  9. Spring MVC 全局异常处理&文件上传

    Spring MVC 全局异常处理 使用SimpleMappingExceptionResolver实现异常处理 在welcome-servlet.xml进行如下配置: <bean class= ...

  10. 非常规的command not found

    在linux环境下会遇到各种command not found的情况,大部分是可以直接安装同名的包可以解决,但有一些不是,这里做一下汇总,总结各种命令或者工具的安装情况: 非同名安装: 包名 Debi ...