题解:P1957 口算练习题

· · 题解

题解 P1957 口算练习题

这里我们可以把题目看成简单的字符串运算。

注意事项

首先首先,itoa 大家都知道是什么吧搞得好像我就知道了一样。\ 通俗一点讲就是把数字转换成字符串。\ 可正常编译器不会给你这玩意怎么办?\ 答:自己做呗。\ 好了,先放上代码:

int j(string a){
    int cnt=0,sz=1;
    if(a=="0"){
        return cnt;
    }
    for(int j=a.size()-1;j>=0;j--){
        cnt+=(a[j]-48)*sz;
        sz*=10;
    }
    return cnt;
}

这个怎么看都有高精那味。\ 就是对于字符串 a。其各个数位减去 ASCII 码中 0 的值得到数位上整数的值乘以 10^{i-1},这里为什么用 i 呢?是因为这里的 i 实际上是从右往左数第几位!

是不是要晕迷糊了?

那就举例子吧。字符串 123456789 怎么变成 123456789?是不是先个位,个位是从右往左数第一位,1-1=0 所以计算 10^0=1。同理 8 是从右往左数第二位,计算 8 \times 10^{2-1}=80。\ 现在没问题了吧。

第二点:\ 远古时期,题解的老前辈告诉我:\

这里特判一下。 知周所众,我这个人呢总喜欢把老代码拿来做题解。所以 `_something_.size()` 对我很不友好。所以说我们用在循环结构里学的**循环取位数**来搞这题。\ 忘了看代码: ```cpp int hs(int a){ int cnt=0; while(a){ a/=10; cnt++; } return cnt; } ``` 这里直接就是进行**去位**的运算。每去一位,计数器便加一。 ## 真正写题 输入第一个数,在输入符号。\ 接下来就到了分支的时候了: 使用函数将字符串强行转化。然后就没有直接照模板抄呗。到了位数时间,使用前面介绍的 `hs()` 来做。\ 注意一点,减法运算如结果为负数,使用 `abs()` 或者自己定的函数来写都是可以的。\ 在里面使用分支,判断是否为负数是的话就在输出前加一个负号,再在长度那一边加上 $1$。\ 乘法加法那边没什么强调的。 对了,要注意符号要跟欧。\ 就是定义 $t$ 在执行完操作后跟上符号的步伐。 剩下的就没什么要说的了。 ## Code 代码易懂,但不易读。 ```cpp #include<iostream> #include<cstdio> #include<cmath> #include<string> using namespace std; int m[105][105],n[105][105]; int judge(int b,int c){ if(c>b){ return 0; } else{ return 1; } } int j(string a){ int cnt=0,sz=1; if(a=="0"){ return cnt; } for(int j=a.size()-1;j>=0;j--){ cnt+=(a[j]-48)*sz; sz*=10; } return cnt; } int hs(int a){ int cnt=0; while(a){ a/=10; cnt++; } return cnt; } int t(int lo){ if(lo==0){ return 1; } else{ return 0; } } int main(){ string a,l; int b,c,d,cnt=0; int a1; cin>>a1; for(int i=1;i<=a1;i++){ cin>>a>>b; if(a!="a"&&a!="b"&&a!="c"){ if(l=="a"){ d=j(a)+b; cout<<j(a)<<"+"<<b<<"="<<d<<endl; cout<<cnt+2+hs(j(a))+hs(b)+hs(d)+t(hs(j(a)))+t(hs(b))+t(hs(d))<<endl; l="a"; } else if(l=="b"){ //d=b-c; if(judge(j(a),b)==0){ d=b-j(a); cout<<j(a)<<"-"<<b<<"=-"<<d<<endl; cout<<cnt+3+hs(j(a))+hs(b)+hs(d)+t(hs(j(a)))+t(hs(b))+t(hs(d))<<endl; } else{ d=j(a)-b; cout<<j(a)<<"-"<<b<<"="<<d<<endl; cout<<cnt+2+hs(j(a))+hs(b)+hs(d)+t(hs(j(a)))+t(hs(b))+t(hs(d))<<endl; } l="b"; } else{ d=b*j(a); cout<<j(a)<<"*"<<b<<"="<<d<<endl; cout<<cnt+2+hs(j(a))+hs(b)+hs(d)+t(hs(j(a)))+t(hs(b))+t(hs(d))<<endl; l="c"; } } else{ cin>>c; if(a=="a"){ d=b+c; cout<<b<<"+"<<c<<"="<<d<<endl; cout<<cnt+2+hs(b)+hs(c)+hs(d)+t(hs(b))+t(hs(c))+t(hs(d))<<endl; l="a"; } else if(a=="b"){ //d=b-c; if(judge(b,c)==0){ d=c-b; cout<<b<<"-"<<c<<"=-"<<d<<endl; cout<<cnt+3+hs(b)+hs(c)+hs(d)+t(hs(b))+t(hs(c))+t(hs(d))<<endl; } else{ d=b-c; cout<<b<<"-"<<c<<"="<<d<<endl; cout<<cnt+2+hs(b)+hs(c)+hs(d)+t(hs(b))+t(hs(c))+t(hs(d))<<endl; } l="b"; } else{ d=b*c; cout<<b<<"*"<<c<<"="<<d<<endl; cout<<cnt+2+hs(b)+hs(c)+hs(d)+t(hs(b))+t(hs(c))+t(hs(d))<<endl; l="c"; } } } return 0; } ``` 没了?\ 没了。