关于本题的提示,问题和质疑(捞)

P1957 口算练习题

JRzyh @ 2023-08-25 13:22:03

先放一下我的ACcode(不是讨论区题解)

#include<bits/stdc++.h>
using namespace std;
string solu(int a,int b,int op)
{
    int ans;
    string rt="";
    if(op==1)ans=a+b;
    if(op==2)ans=a-b;
    if(op==3)ans=a*b;
    if(ans==0)return "0"; 
    if(ans<0)rt="-",ans=-ans;
    int ps=1;//here 1
    while(ps<=ans)ps*=10;
    ps/=10;
    while(ps>=1)
    {
        rt+=(ans/ps)%10+'0';
        ps/=10;
    }
    return rt;
}
char opt[5];
int n,op;
string str;
int main()
{
    opt[1]='+';opt[2]='-';opt[3]='*';
    cin>>n;
    getchar();
    getchar();//here 2
    for(int j=1;j<=n;j++)
    {
        int st=0;
        getline(cin,str);
        if(str[0]=='a')op=1,st=2;
        if(str[0]=='b')op=2,st=2;
        if(str[0]=='c')op=3,st=2;

        int a=0,b=0,i;
        string ans="";
        for(i=st;;i++)
        {
            if(str[i]<'0'||str[i]>'9')break;//here 3
            a*=10;
            a+=(str[i]-'0');
            ans+=str[i];

        }
        i++;
        ans+=opt[op];
        for(;i<str.size()&&str[i]!='\n'&&str[i]!='\r';i++)
        {
            b*=10;
            b+=(str[i]-'0');
            ans+=str[i];
        }
        ans+='=';
        ans+=solu(a,b,op);
        cout<<ans<<endl<<ans.size()<<endl;
    }
    return 0;
}

提示部分:

注释一的位置不能用log算数字位数,会有浮点数误差(可能只有我这么干)

注释二的地方需要两个getchar,因为本题目数据可能在windows下制造。

问题部分:

注释一的位置如果非要用log有无避免浮点数误差的好方法?

注释二的地方有无合适的替换来做到读入整行string?以及能否讲解一下什么时候getline前需要getchar和需要几个?

注释三的地方改成 str[i]==' ' 就会RE,表现为循环不停止,为什么?

质疑部分:

关于本题数据:

第一,作为一个字符串题目,数据在windows下制造会极大影响做题感觉,是否应当替换?

第二,本题的题解有几篇是错的,(VenusM1nT大佬和与他做法类似的几篇)

hack:

2
a 114 514
1 2

原理是只有两个数时,第一个数有可能一位。

个人认为没有因为这个hack撤题解的价值,放在评论区供后人考察

希望后人能从提示中获益,当然也希望能有大佬能来解答我的问题或处理我的质疑

感激不尽。


by Bingxiu @ 2023-08-25 13:27:13

@JRzyh 第一个问题建议 \texttt{long double},并且求出结果后 +1e-10()


by Bingxiu @ 2023-08-25 13:28:42

@JRzyh 注释 3 那里万一到字符串最后一格 '\0' 了再往后就挂了


by Bingxiu @ 2023-08-25 13:29:07

@JRzyh 第二个问题最好 \texttt{strtok} 一下()


by JRzyh @ 2023-08-25 13:29:44

@Bingxiu 注释三到不了啊,这是第一个数的提取


by forgotmyhandle @ 2023-08-25 13:47:36

getline主要是换行符问题,什么 \r \n 一类的空字符。反正 cin 好像是读到空字符就不读了,getline要读到换行符,也就是 \n。所以 cin 后接 getline 的话一般要 getchar。至于要一个还是要两个自己试试就好了。一般情况下 scanf 应该跟 cin 差不多,除非你在 scanf("%s") 的 %s 后面跟一些奇怪的东西。从你这边看的话 getline 接 getline 应该就是不用 getchar 的。


by JRzyh @ 2023-08-25 13:50:04

thx


by Bingxiu @ 2023-08-25 14:31:49

@JRzyh 问题就是如果是单独的数就会读到 '\0'()


by JRzyh @ 2023-08-25 15:34:34

问题三又好了,不会RE了,我也不知道为什么


|