【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)23+(3)15-(1)2
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)的更多相关文章
- 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 ...
- P1771 方程的解_NOI导刊2010提高(01)
P1771 方程的解_NOI导刊2010提高(01) 按题意用快速幂把$g(x)$求出来 发现这不就是个组合数入门题吗! $k$个人分$g(x)$个苹果,每人最少分$1$个,有几种方法? 根据插板法, ...
- 【洛谷】【堆】P1801 黑匣子_NOI导刊2010提高(06)
[题目描述:] Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两 ...
- 洛谷 P1777 帮助_NOI导刊2010提高(03) 解题报告
P1777 帮助_NOI导刊2010提高(03) 题目描述 Bubu的书架乱成一团了!帮他一下吧! 他的书架上一共有n本书.我们定义混乱值是连续相同高度书本的段数.例如,如果书的高度是30,30,31 ...
- P1776 宝物筛选_NOI导刊2010提高(02)&& 多重背包二进制优化
多重背包, 要求 \(N\log N\) 复杂度 Solution 众所周和, \(1-N\) 之内的任何数可以由 \(2^{0}, 2^{1}, 2^{2} ... 2^{\log N}, N - ...
- P1801 黑匣子_NOI导刊2010提高(06)
P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...
- Luogu P1801 黑匣子_NOI导刊2010提高(06)
P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...
- P1794 装备运输_NOI导刊2010提高(04)
P1794 装备运输_NOI导刊2010提高(04) 题目描述 德国放松对英国的进攻后,把矛头指向了东边——苏联.1943年初,东线的战斗进行到白热化阶段.据可靠情报,90余万德国军队在库尔斯克准备发 ...
- 洛谷—— P1775 古代人的难题_NOI导刊2010提高(02)
P1775 古代人的难题_NOI导刊2010提高(02) 题目描述 门打开了,里面果然是个很大的厅堂.但可惜厅堂内除了中央的一张羊皮纸和一支精致的石笔,周围几具骷髅外什么也没有.难道这就是王室的遗产? ...
随机推荐
- Closest Common Ancestors (Lca,tarjan)
午时刷题,难甚,遂小憩于桌上,惊醒,于梦中有所得,虽大声曰:吾已得tarjan之奥秘! 关于tarjan算法,其实就是一个递归加并查集的应用. 大致代码: #include<bits/stdc+ ...
- python学习-3 python基础-1基础知识和解释器
1.基础知识 ~后缀名是可以是任意的 ~导入模块时,如果不是.py就会报错 =>>所以尽量后缀名携程.py 2.执行方式 -python解释器 3. #!/usr/bin/env py ...
- [javascript]localStorage和sessionStorage区别
一.sessionStorage.localStorage.cookie可查看的位置,F12=>Application: 二.cookie .sessionStorage与localStorag ...
- Python实现字符的冒泡排序——说实话,两个数兑换的方法震惊了我,一天比一天感受到了Python的强大
import random M= lettList=[] for i in range(M): lettList.append(chr(random.randrange(,))) for lett i ...
- WebStorm使用码云插件问题
由于项目需求,需要在WebStorm中使用码云插件,在下载安装的过程中出现一系列的问题,现总结出现的问题和解决方法. 先说一下码云是什么?码云有什么作用? 码云的主要功能: 码云除了提供最基础的 Gi ...
- Pattern Recognition and Machine Learning-01-Preface
Preface Pattern recognition has its origins in engineering, whereas machine learning grew out of com ...
- mysql5.7 密码字段名更改
由password更改为authentication_string update user set authentication_string=password("123456") ...
- 页面加载完毕后调用js方法进行布局操控 已实验
页面加载完毕后调用js方法进行布局操控 已实验 $(function(){ var check1 = $("[id$=SMS]").is(':checked'); var bl=$ ...
- validform 自定义校验
validform虽然很强大,但是依然不能满足我们各种奇葩的校验,这是时候就需要我们自己去手写. vaildform 也是基于jq的,正常我们需要引入5个文件 supply 是我们自定义方法的js文件 ...
- 【1】Git基础
一.Git概念 1.1.Git定义 Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目.Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发 ...