hdu 3546 Calculator

若c=b,则之前的C不要求,直到遇到更前面有a=c或a*=c或a+=c时,C的值才要计算

#include<iostream> #include<cstdio> #include<string.h> using namespace std; const int base=10000; const int width=4; const int N=1300; struct bint { int ln,v[N]; bint(int r=0) { for(ln=0;r>0;r/=base) v[ln++]=r%base; } bint operator = (const bint& r) { memcpy(this,&r,(r.ln+1)*sizeof(int)); } }; bool operator < (const bint& a,const bint& b) { int i; if(a.ln!=b.ln) return a.ln<b.ln; for(i=a.ln-1;i>=0&&a.v[i]==b.v[i];i--); return i<0?0:a.v[i]<b.v[i]; } bool operator <= (const bint& a,const bint& b) { return !(b<a); } bint operator + (const bint& a,const bint& b) { bint res; int i,cy=0; for(i=0;i<a.ln||i<b.ln||cy>0;i++) { if(i<a.ln) cy+=a.v[i]; if(i<b.ln) cy+=b.v[i]; res.v[i]=cy%base;cy/=base; } res.ln=i; return res; } bint operator * (const bint& a,const bint& b) { bint res;res.ln=0; if(0==b.ln){ res.v[0]=0;return res; } int i,j,cy; for(i=0;i<a.ln;i++) for(j=cy=0;j<b.ln||cy>0;j++,cy/=base) { if(j<b.ln) cy+=a.v[i]*b.v[j]; if(i+j<res.ln) cy+=res.v[i+j]; if(i+j>=res.ln) res.v[res.ln++]=cy%base; else res.v[i+j]=cy%base; } return res; } void write(const bint& v) { int i; printf("%d",v.ln==0?0:v.v[v.ln-1]); for(i=v.ln-2;i>=0;i--) printf("%04d",v.v[i]); printf("\n"); } char buf[10]; bint b[10]; struct o { int a,b,o;//0:+ 1:* 2:= }o[400000]; bool flag[10],cal[400000]; int main() { for(int i=0;i<10;i++) b[i]=1; int i=0; while(scanf("%s",buf)!=EOF&&buf[0]!='#') { o[i].a=buf[0]-'A'; if(buf[1]=='+') o[i].o=0,o[i].b=buf[3]-'A'; else if(buf[1]=='*') o[i].o=1,o[i].b=buf[3]-'A'; else o[i].o=2,o[i].b=buf[2]-'A'; i++; } for(int j=0;j<10;j++) flag[j]=true; for(int j=i-1;j>=0;j--) { cal[j]=flag[o[j].a]; if(o[j].o==2) flag[o[j].a]=false,flag[o[j].b]=true; } for(int j=0;j<i;j++) { if(cal[j]) { if(o[j].o==0) b[o[j].a]=b[o[j].a]+b[o[j].b]; else if(o[j].o==1) b[o[j].a]=b[o[j].a]*b[o[j].b]; else b[o[j].a]=b[o[j].b]; } } for(int i=0;i<10;i++) write(b[i]); return 0; }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值