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;
}