全WA,可是洛谷IDE跑案例和一些其他的数据好像都没错啊

P1957 口算练习题

FrankNanthan @ 2022-02-18 13:33:37

代码

#include <iostream>
using namespace std;

int str2int(string x){
    int re = 0;
    for (int i = 0; i < x.length(); ++i) {
        if (x[i] >= '0' && x[i]<= '9'){
            int temp = x[i] - '0';
            re = 10 * re + temp;
        }
    }
    return re;
}

int getLen(int x){
    if (x == 0) return 1;
    int dig = 0;
    // 计算负号位
    if (x < 0){
        dig++;
        x = -x;
    }

    for (int i = 1; x / i != 0; i *= 10) {
        dig++;
    }
    return dig;
}

void D(){
    int n;
    cin>>n;
    cin.ignore();
    for (int i = 0; i < n; ++i) {
        string a;
        char op;
        getline(cin, a);
        //开始用的switch case 判断a[0]是'a','b','c'的哪一个,结果发现getline会读如一些奇怪的数据在前面 如 \U0000200e 不知道是什么 导致后面全错 所以改成if;
         if (a.find('a') != -1){
            op = '+';
            a = a.substr(a.find('a') +2);
        } else if (a.find('b') != -1){
            op = '-';
            a = a.substr(a.find('b') +2);
        }else if (a.find('c') != -1){
            op = '*';
            a = a.substr(a.find('c') +2);
        }
        int x1 = str2int(a.substr(0, a.find(' '))),
        x2 = str2int(a.substr(a.find(' ')+ 1));
        int re;
        switch (op) {
            case '+':
                re = x1 + x2;
                break;
            case '-':
                re = x1 - x2;
                break;
            case '*':
                re = x1 * x2;
                break;
        }
        cout<<x1<<op<<x2<<"="<<re<<endl;
        cout<<a.length() + getLen(re) + 1<<endl;
    }
}

int main(){
    D();
    return 0;
}

不知道错误是在哪儿

以下是我尝试的一些案例:


in:
5
c 2620 6343
a 216 1149
b 7761 5655
7168 3961
a 9755 3461

out:
2620*6343=16618660
18
216+1149=1365
13
7761-5655=2106
14
7168-3961=3207
14
9755+3461=13216
15

in:
4
a 64 46
275 125
c 11 99
b 46 64

out:
64+46=110
9
275+125=400
11
11*99=1089
10
46-64=-18
9

by Neutralized @ 2022-02-18 13:38:18

getline
狗都不用
请问直接cin不行吗?

以及我远古的代码,您可以参考

#include <bits/stdc++.h>
using namespace std;
int main()
{
    char a;
    int n,c,d;
    char s[100],in[10];
    cin>>n;
    for(int i=0;i<n;i++)
    {
        cin>>in;
        if(in[0]>='a'&&in[0]<='c')
        {
            a=in[0];
            cin>>c>>d;
        }
        else
        {
            sscanf(in,"%d",&c);
            cin>>d;
        }
        memset(s,0,sizeof(s));
        if(a=='a')
        {
            sprintf(s,"%d+%d=%d",c,d,c+d);
         } 
         else if(a=='b')
        {
            sprintf(s,"%d-%d=%d",c,d,c-d);
         } 
         else if(a=='c')
        {
            sprintf(s,"%d*%d=%d",c,d,c*d);
         } 
         cout<<s<<endl<<strlen(s)<<endl;
    }
    return 0;
}

by FrankNanthan @ 2022-02-18 13:59:30

@Neutralized 谢谢 学到了 确实因为用getline出现过很多次错误,搞得我还到处想办法忽略一些奇怪的字符。为getline耗费了太多精力


by 编码落寞 @ 2022-02-18 14:01:50

@FrankNanthan

可以把 cin.ignore();改成 scanf("\r\n");试下。

cin.ignore();可能没有完全忽略掉换行


|