题解:P1957 口算练习题
wwwwwwqqqqq111
·
·
题解
题解 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;
}
```
没了?\
没了。