【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) 题目描述 门打开了,里面果然是个很大的厅堂.但可惜厅堂内除了中央的一张羊皮纸和一支精致的石笔,周围几具骷髅外什么也没有.难道这就是王室的遗产? ...
随机推荐
- php中连接tcp服务的三种方式
首先需要现有一个 tcp 服务,我们使用 php中的 socket 系列函数实现 <?php //创建socket套接字 $socket = socket_create(AF_INET, SOC ...
- 【Python基础】02_Python中变量的输入输出
1.变量的输入: input函数: input() input("请输入银行卡密码") password = input("请输入银行卡密码") 变量名 = i ...
- 用bisect来管理已排序的序列
bisect 模块包含两个主要函数,bisect 和 insort,两个函数都利用二分查找算法来在有序序列中查找或插入元素. 2.8.1 用bisect来搜索 bisect(haystack, nee ...
- 牛客 133D 挑选队友 (分治FFT)
大意: $n$个人, 分别属于$m$个组, 要求选出$k$个人, 使得每组至少有一人, 求方案数. 显然答案为$\prod((1+x)^{a_i}-1)$的第$k$项系数, 分治$FFT$即可. #i ...
- Eclipse MyEclipse 反编译.class文件 myeclipse source not found
首先,需要下载两个必须的插件包. 一个是:准备反编译需要的jad.exe 下载地址:http://varaneckas.com/jad/ 二个是:反编译编辑器net.sf.jadclipse_3.3. ...
- 前端vue项目执行npm install 报错cd() never called()
前端我刚开始接触Vue,从GitHub上下载了代码程序,但缺少一些插件,用vscode打开并下载插件执行报错cd() never called! 解决的方式 1.执行cmd命令行不要再vscode里执 ...
- Session Timer机制分析
Session Timer机制分析 功能介绍 会话初始化协议(SIP)并没有为所建立的会话定义存活机制.尽管用户代理可以通过会话特定的机制判断会话是否超时,但是代理服务器却做不到这点.如此一来,代理服 ...
- 关于dataset
举个栗子: <div id="cost" data-drink="coffee" data-food="sushi" data-mea ...
- vue生命周期详细过程
- 在vue中引用echarts导致Cannot read property getAttribute of null ?
报错信息如下: 之前一直用echarts没有出现过这个问题,所以当这个问题出现时我就开始了各种查,试了几种方法依旧报错,比如: 1.在mounted() {},写成如下形式:(依旧报错) this.$ ...