求助大佬,悬关

P1957 口算练习题

some_ICE_ANK @ 2023-06-06 21:32:15

全WA,下载数据1能过,评测过不了

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
    int t;
    scanf("%d\n",&t);
    int flag;
    for(int q=1;q<=t;q++){
        string a;
        getline(cin,a);
        int len=a.length();
        if(a[0]>='a' && a[0]<='z'){
            flag=a[0]-'a'+1;
        }
        int n=0,m=0;
        int i=0;
        if(a[0]>='a' && a[0]<='z'){
            i=2;
        }
        for(;a[i]!=' ';i++){
            n*=10;
            n+=a[i]-'0';
        }
        i++;
        for(;i<len;i++){
            m*=10;
            m+=a[i]-'0';
        }
        int ans;
        cout<<n;
        if(flag==1){
            cout<<'+';
            ans=n+m;
        }else if(flag==2){
            ans=n-m;
            cout<<'-';
        }else{
            ans=n*m;
            cout<<'*';
        }
        cout<<m<<'='<<ans<<endl;
        int cnt=0;
        cnt+=len+1;
        if(a[0]>='a' && a[0]<='z'){
            cnt-=3;
        }else{
            cnt--;
        }
        cnt+=1;
        if(ans<0){
            cnt++;
        }
        do{
            cnt++;
            ans/=10;
        }while(ans!=0);
        cout<<cnt<<endl;
    }
    return 0;
}

by XSean @ 2023-06-06 21:47:17

@ANK_INK_sans en...同学,你样例,也没有过呢


by XSean @ 2023-06-06 22:03:43

for(;i<len;i++){
    m*=10;
    m+=a[i]-'0';
}

改为

for(;i<len-1;i++){
    m*=10;
    m+=a[i]-'0';
}

by XSean @ 2023-06-06 22:09:17

@ANK_INK_sans

同学,你知道为什么吗,解答: 使用getline时请注意:它会直接读取到字符串的换行符,就是len假如读取a 64 46看似7实则8

总结:注意自己的输入方式


by Zzzcr @ 2023-06-06 22:26:13

@Sean_xzx 问题是这么改了之后还是会wa的,可以自己用洛谷ide试下

我原本以为改成这样就行

for (; i < len - (q != t); i++)
{
    m *= 10;
    m += a[i] - '0';
}

附上第一组数据

Input:

1
a 99 999

Output:

99+999=1098
11

结果诡异的是洛谷ide过了,交上去还是wa的


by XSean @ 2023-06-06 22:39:33

@Zzzcr 是啊,我再看看


by XSean @ 2023-06-06 22:44:03

@Zzzcr 我的想法是本题的测评机或许比较特殊


by XSean @ 2023-06-07 07:57:36

@ANK_INK_sans 代码中有错误解释

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(){
    int t;
    scanf("%d\n",&t);
    int flag;
    for(int q=1;q<=t;q++){
        string a="";
        //getline(cin,a);不使用getline,因为容易读写到空格或空行
        cin>>a;//先输入第一个
        //int len=a.length();去掉
        if(a[0]>='a' && a[0]<='z'){
            flag=a[0]-'a'+1;
        }
        int n=0,m=0;
        int i=0;
        string b="",c="";//定义b,c
        cin>>b;//先输入第二个
        if(a[0]>='a' && a[0]<='z'){
            i=2;
            cin>>c;//如果a是字母输入第三个
        }
        a+=" "+b+((c!="")?" ":"")+c;//将a合并,并看看后面还有没有c这个数,判断条件((c!="")?" ":"")如果c!="",说明c有数,就+“ ”,否则+“”
        int len=a.length();//重新算len,结束
        for(;a[i]!=' ';i++){
            n*=10;
            n+=a[i]-'0';
        }
        i++;
        for(;i<len;i++){
            m*=10;
            m+=a[i]-'0';
        }
        int ans;
        cout<<n;
        if(flag==1){
            cout<<'+';
            ans=n+m;
        }else if(flag==2){
            ans=n-m;
            cout<<'-';
        }else{
            ans=n*m;
            cout<<'*';
        }
        cout<<m<<'='<<ans<<endl;
        int cnt=0;
        cnt+=len+1;
        if(a[0]>='a' && a[0]<='z'){
            cnt-=3;
        }else{
            cnt--;
        }
        cnt+=1;
        if(ans<0){
            cnt++;
        }
        do{
            cnt++;
            ans/=10;
        }while(ans!=0);
        cout<<cnt<<endl;
    }
    return 0;
}

by some_ICE_ANK @ 2023-06-07 18:06:30

谢谢老师


|