求第五个点的数据,我把能想到的情况都想到了,还是90分

P1957 口算练习题

Yemengying @ 2023-08-01 16:51:44

如果有更简洁的代码我会去看题解的,现在我认为我这个代码应该是没什么问题的。把第五个点的数据找出来再修改一下应该就过了。

Ps:是屎山代码,慎看

#include<bits/stdc++.h>
using namespace std;
int main(){
    string c;
    char s;
    int a,b,len=2,n,b0=0,d=1;
    cin>>n;
    for(int i=1;i<=n;i++){
        int x;
        cin>>c>>a;
        if(c[0]=='a'){
            s=c[0];
            cin>>b;
            x=a+b;
            cout<<a<<"+"<<b<<"="<<x<<endl;
        }else if(c[0]=='b'){
            s=c[0];
            cin>>b;
            x=a-b;
            cout<<a<<"-"<<b<<"="<<x<<endl;

        }else if(c[0]=='c'){
            s=c[0];
            cin>>b;
            x=a*b;
            cout<<a<<"*"<<b<<"="<<x<<endl;
        }else{
            int lens=c.length(),j=0;
            while(j<lens){
                for(int i=c.length()-1;i>j;i--) d*=10;
                b0=b0+(c[j]-'0')*d;
                d=1;
                j++;
            }
            b=b0;
            if(s=='a'){x=a+b;cout<<b<<"+"<<a<<"="<<x<<endl;}
            if(s=='b'){x=b-a;cout<<b<<"-"<<a<<"="<<x<<endl;}
            if(s=='c'){x=a*b;cout<<b<<"*"<<a<<"="<<x<<endl;}
        }
        if(x<0){len++;x=abs(x);}
        if(x==0){len++;}
        while(a!=0){len++;a/=10;}
        while(b!=0){len++;b/=10;}
        while(x!=0){len++;x/=10;}
        cout<<len<<endl;
        len=2;
        b0=0;
    }
    return 0;
}

by sxjsxj @ 2023-08-01 16:59:42

我觉得循环里else下面那个字符串变成整数的有点怪怪的

int a;
for(i=0;i<c.length();i++)
    a=a*10+c[i]-'0';

你把这个改一下,试试对不对,我再看一下


by Parrhesiates @ 2023-08-01 17:08:26

@Yemengying 当有数据为0的时候要特判,因为用这个方法求位数的话,0的位数会判为0。 比如这组

1

a 0 0


by Parrhesiates @ 2023-08-01 17:08:59

@liuyidu 下面是 a 0 0


by sxjsxj @ 2023-08-01 17:19:04

略微修改一下,AC了,求关注

#include<bits/stdc++.h>
using namespace std;
int main()
{
    string c;
    char s;
    int a,b,len=2,n,d=1;
    cin>>n;
    while(n--)//while循环比for循环快 
    {
        int x;
        cin>>c;
        getchar();
        cin>>a;
        if(c[0]>='a' && c[0]<='c')
        {
            s=c[0];
            cin>>b;
            switch(c[0])
            {
                case 'a':
                    x=a+b;
                    cout<<a<<"+"<<b<<"="<<x<<endl;
                    break; 
                case 'b':
                    x=a-b;
                    cout<<a<<"-"<<b<<"="<<x<<endl;
                    break;
                case 'c':
                    x=a*b;
                    cout<<a<<"*"<<b<<"="<<x<<endl;
                    break;
            }
        }//通过简单观察,可以发现每个分支的前两行重复,可以整合在一起,再用一个switch循环更简洁 
        else
        {
            int lens=c.length();
            b=0;
            for(int i=0;i<lens;i++)
                b=b*10+c[i]-'0';
            if(s=='a'){x=a+b;cout<<b<<"+"<<a<<"="<<x<<endl;}
            if(s=='b'){x=b-a;cout<<b<<"-"<<a<<"="<<x<<endl;}
            if(s=='c'){x=a*b;cout<<b<<"*"<<a<<"="<<x<<endl;} 
        }
        if(x<0){len++;x=abs(x);}
            if(a==0)len++;
            if(b==0) len++;
            if(x==0) len++;//如果a、b、x有一个为0的话,下面的算位数就会返回0,前面要特别判断 
            while(a){len++;a/=10;}
            while(b){len++;b/=10;}
            while(x){len++;x/=10;}
            cout<<len<<endl;
            len=2;
    }
    return 0;
}

by Yemengying @ 2023-08-01 18:26:05

@liuyidu 好的,谢谢


by Yemengying @ 2023-08-01 18:26:49

@sxjsxj 谢谢大佬


|