我的输出和测试点的输出是一致的,为什么还会出现RE错误呢。题目P1957,题目描述 王老师正在教简单算术运算。细心的王老师收集了 i 道学生经常做错的口算题,并且想整理编写成一份练习。 编排这些题目是一件繁琐的事情,为此他想用计算机程序来提高工作效率。王老师希望尽量减少输入的工作量,比如
5+8 的算式最好只要输入 5 5 和 8 8,输出的结果要尽量详细以方便后期排版的使用,比如对于上述输入进行处理后输出
5+8=13 以及该算式的总长度 6。王老师把这个光荣的任务交给你,请你帮他编程实现以上功能。
输入格式 第一行一个整数 i。
接着的 i 行为需要输入的算式,每行可能有三个数据或两个数据。
若该行为三个数据则第一个数据表示运算类型, a 表示加法运算, b 表示减法运算, c 表示乘法运算,接着的两个数据表示参加运算的运算数。
若该行为两个数据,则表示本题的运算类型与上一题的运算类型相同,而这两个数据为运算数。
输出格式 输出 2×i 行。对于每个输入的算式,输出完整的运算式及结果,第二行输出该运算式的总长度。 这是我写的代码,是出现数组越界的问题了吗?我用的是string类型
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
int apart(int sum){
int i=0;
sum=abs(sum);
while(sum>0){
sum/=10;
i++;
}
return i;
}
int main()
{
int a[10]={0};
int b[10]={0};
int n;
cin>>n;
cin.ignore();
string c;
char op;
int count=0;
int j=0;
int k=0;
for(int i=0;i<n;i++){
getline(cin,c);
if(c[0]>='a'&&c[0]<='c'){
op=c[0];
// cout<<"operator is "<<op<<endl;
}
while(1){
// cout<<"c["<<j<<"]="<<c[j]<<endl;
if(c[j]>='1'&&c[j]<='9'){
a[k]=(int)c[j]-48;
k++;
}
if(c[j]>='1'&&c[j]<='9'&&c[j+1]==' '){
j++;
break;
}
j++;
}
// cout<<"第一个数拆解成功"<<endl;
// for(int l=0;l<5;l++){
// cout<<a[l]<<" ";
// }
count=0;
int temp_a=k;
k=0;//重置数组计数器
while(c[j]!='\0'){
if(c[j]>='1'&&c[j]<='9'){
b[k]=(int)c[j]-48;
k++;
}
j++;
}
int temp_b=k;
k=0;
j=0;
int ob1=0;int ob2=0;//用于存储两个相加的数
for(int l=temp_a-1;l>=0;l--){
ob1+=a[l]*pow(10,temp_a-1-l);
}
for(int l=temp_b-1;l>=0;l--){
ob2+=b[l]*pow(10,temp_b-1-l);
}
int sum=0;
switch(op){
case 'a':
sum=ob1+ob2;
cout<<ob1<<"+"<<ob2<<"="<<sum<<endl;
cout<<temp_a+temp_b+apart(sum)+2<<endl;
break;
case 'c':
sum=ob1*ob2;
cout<<ob1<<"*"<<ob2<<"="<<sum<<endl;
cout<<temp_a+temp_b+apart(sum)+2<<endl;
break;
case 'b':
sum=ob1-ob2;
cout<<ob1<<"-"<<ob2<<"="<<sum<<endl;
if(sum<0){
cout<<temp_a+temp_b+apart(sum)+3<<endl;
}else{
cout<<temp_a+temp_b+apart(sum)+2<<endl;
}
break;
}
for(int l=0;l<5;l++){
a[l]=0;
b[l]=0;
}
}
// char a='1';49
// cout<<(int)a;
}