【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) 题目描述 门打开了,里面果然是个很大的厅堂.但可惜厅堂内除了中央的一张羊皮纸和一支精致的石笔,周围几具骷髅外什么也没有.难道这就是王室的遗产? ...
随机推荐
- S02_CH09_UART串口中断实验
S02_CH09_UART串口中断实验 本章的UART中断将在之前PL_PS中断和定时器中断上推导出来,因此本章有点难度,如果前两章还不是很熟悉的话,需要返回到前面两章把这两章的内容再次消化一下,再来 ...
- Unable to bind to http://localhost:8080 on the IPv6 loopback interface: 'Cannot assign requested address'.
.net core+nginx警告: warn: Microsoft.AspNetCore.Server.Kestrel[0] Unable to bind to http://localhost:5 ...
- [NOIP10.6模拟赛]1.merchant题解--思维+二分
题目链接: while(1)gugu(while(1)) 闲扯 考场上怕T2正解写挂其他两题没管只打了暴力,晚上发现这题思维挺妙的 同时想吐槽出题人似乎热衷卡常...我的巨大常数现在显露无疑QAQ 分 ...
- python 读取文件行
将文件转化成二进制码,并读取行数,计算总行数 import os Str=input("请输入路径") Sum=0 def read(Str): a = os.listdir(St ...
- 使用Docker搭建MySQL服务
一.安装docker windows 和 mac 版可以直接到官网下载 docker desktop linux 的安装方法可以参考 https://www.cnblogs.com/myzony/p/ ...
- MySQL安装步骤及环境变量配置
MySQL安装 MySQL下载地址:http://dev.mysql.com/downloads/installer/1:首先进入的是安装引导界面2:然后进入的是类型选择界面,这里有3个类型:Typi ...
- selenium检测webdriver封爬虫的解决方法
有不少朋友在开发爬虫的过程中喜欢使用Selenium + Chromedriver,以为这样就能做到不被网站的反爬虫机制发现. 先不说淘宝这种基于用户行为的反爬虫策略,仅仅是一个普通的小网站,使用一行 ...
- kubernetes之node资源紧缺时pod驱逐机制
在系统硬件资源紧缺的情况下保证node的稳定性, 是kubelet需要解决的一个重要问题 1.驱逐策略 kubelet持续监控主机的资源使用情况, 一旦出现资源紧缺的迹象, kubelet就会主动终止 ...
- web开发: css高级与盒模型
一.组合选择器 二.复制选择器优先级 三.伪类选择器 四.盒模型 五.盒模型显示区域 六.盒模型布局 一.组合选择器 <!DOCTYPE html> <html> <he ...
- Canvas对画布及文字控制基础API学习
这次纯API练习,比较简单,但是是为了之后的结合项目打基础的,所以也不能忽视它,下面开始: Canvas的平移.旋转.缩放 这里还是以上次画那个青春痘的DEMO为例[http://www.cnblog ...