大佬们,麻烦帮忙看看我的代码有什么问题,谢谢!

P1957 口算练习题

wow12138 @ 2022-08-08 21:29:07

#include<bits/stdc++.h>
using namespace std;
int sz(string a,int b,int c){//函数作用:将字符串a中第b项到第c项的数转化为int型数据,方便运算。 
    int d=0;
    for(int i=b;i<=c;i++){
        d=d*10;
        d=d+a[i]-'0';
    }
    return d;
}
int main(){
    int n,flag=1;//n表示n个算式;flag用来表示运算符号,值为1、2、3分别表示加减乘。 
    cin>>n;
    string a[n];//a[i]为记录的字符串。 
    getline(cin,a[0]);//输入n有回车,需要这行保证真正的a[0]不会读错。 
    for(int i=0;i<=n-1;i++){
        getline(cin,a[i]);
    }
    for(int i=0;i<=n-1;i++){
        if(a[i][0]=='a'){
            flag=1;
        }
        if(a[i][0]=='b'){
            flag=2;
        }
        if(a[i][0]=='c'){
            flag=3;
        }//查看运算符号。 
        int d=0,e=0,f,g,h;//d、e用来标记第一个数的开头、结尾在字符串中的位置;
        //f、g、h分别记录输入的两个数和结果;
        //比如:a 12 13中d、e分别为2(a[2]=1)、3(a[3]=2),f、g、h分别为12、13、25。
        for(int j=0;;j++){
            if(a[i][j]>='0'&&a[i][j]<='9'){
                d=j;
                break;
            }
        }
        for(int j=d+1;;j++){
            if(a[i][j]==' '){//第一个数结束后下一位必然是' ',借此得出e。 
                e=j-1;
                break;
            }
        }
        f=sz(a[i],d,e);//计算f。 
        g=sz(a[i],e+2,a[i].size()-1);//第二个数必然始于第一个数结尾后2位,终于字符串末尾。 
        cout<<f;
        if(flag==1){//根据flag输出对应的符号并算出h。 
            cout<<'+';
            h=f+g;
        }
        if(flag==2){
            cout<<'-';
            h=f-g;
        }
        if(flag==3){
            cout<<'*';
            h=f*g;
        }
        int x=h,count=0;//x即h,因为h还要输出,值不能变,用x代替进行运算;count计算位数。 
        if(x<0){//h若是负数,负号占一位。 
            count++;
        }
        while(x!=0){//算出h的位数。 
            x=x/10;
            count++;
        }
        cout<<g<<'='<<h<<endl<<-d+1+a[i].size()+count<<endl;
        //总长度=[e-d+1](第一个数)+[(a[i].size-1)-(e+2)+1](第二个数)+[count](第三个数)+2(负号)=上式 
    }
return 0;}

by wow12138 @ 2022-08-09 23:41:53

@ZQHyyds123 好的,谢谢!


上一页 |