大神们!!请指教一下吧,实测都对,就是不过,咋回事啊?!!

P1957 口算练习题

Allen_teacher @ 2023-12-06 15:42:16

#include <bits/stdc++.h>
#include <vector>
using namespace std;

vector <char> t; // 存储用户输入的每一行字符串(含空格)
vector <vector <char>> arr; // 将用户输入的含有空格的每一行字符串 转存到二维数组中
int main(){
    int n; cin >>n; 

//  int n;
//  string ts;
//  getline(cin,ts);
//  n=ts[0]-'0';

    string s; // 接收每行含有空格的字符串
    cin.ignore(); // 清除cin的回车缓存
    for(int i=0;i<n;i++){
        getline(cin,s); // getline(cin,string类型)
        t.clear(); // vector t 转存下一个字符串前 记得清空一下
        for(unsigned int j=0;j<s.length();j++) t.push_back(s[j]); // 将字符串s中的每个元素 插入到vector t中
        arr.push_back(t); // 将 vector t 插入到vector二维数组arr中
    }

    char f; // 读取运算符
    int a,b,tn,cnt; // a、b保存两个运算数  tn:将字符数的每一位还原为运算数  cnt:统计运算数的位数
    for(unsigned int i=0;i<arr.size();i++){
        tn=0; cnt=0; a=0; b=0; // 遍历二维数组中每一行时,需要重新赋初值0
        if(!(arr[i][0]>='0'&&arr[i][0]<='9')){ // 遍历每一个行的 第一个元素 是否为 非数字(即是否为运算符号字母)
            f=arr[i][0]; // 记录运算符
            for(unsigned int j=2;j<arr[i].size();j++){ // 含有运算符的行  从下标2开始遍历 依次读取字符数字 进行还原  并保存到a与b中
                if(!(arr[i][j]==' ')){ // 没到空格处  说明运算数还没还原完毕
                    tn = tn*10+(arr[i][j]-'0'); // 把每一位字符数字还原为运算数
                    cnt++; // 每还原一位 位数+1
                    if(j==arr[i].size()-1) b=tn; // 如果下标到最后了 则将tn赋给运算数b 
                } else{
                    a=tn; // 到空格处  将此时的tn值 赋给a  说明第一个运算数 还原完毕
                    tn=0; // 第一个运算数还原完成后 tn重新赋值0
                    continue;   
                }
            }   
        } else{
            for(unsigned int j=0;j<arr[i].size();j++){ // 不含有运算符的行  从下标0开始遍历 依次读取字符数字 进行还原  并保存到a与b中
                if(!(arr[i][j]==' ')){ // 没到空格处  说明运算数还没还原完毕
                    tn = tn*10+(arr[i][j]-'0'); // 把每一位字符数字还原为运算数
                    cnt++; // 每还原一位 位数+1
                    if(j==arr[i].size()-1) b=tn; // 如果下标到最后了 则将tn赋给运算数b
                } else{
                    a=tn; // 到空格处  将此时的tn值 赋给a  说明第一个运算数 还原完毕
                    tn=0; // 第一个运算数还原完成后 tn重新赋值0
                    continue;   
                }           
            }
        }

        int r; // 存储两个运算数的运算结果
        char ysf; // 存储运算符
        if(f=='a'){
            ysf='+';
            r=a+b;
        }
        if(f=='b'){
            ysf='-';
            r=a-b;
        }
        if(f=='c'){
            ysf='*';
            r=a*b;
        }

        int l; // 存储运算结果的位数
        if(r>=0) l=0; // 运算结果大于0的时候,位数从0开始计算
        if(r<0) l=1; // 运算结果小于0的时候,位数从1开始计算(计算-号)

        int r2=r; // 将r的值转存到r2中
        while(r2){ // 统计计算结果的位数
            r2=r2/10;
            l++;
        }
        cout <<a <<ysf <<b <<'=' <<r <<endl <<cnt+l+2;
        if(i<arr.size()-1){
            cout <<endl;
        }   
    }   

    return 0;
}

|