为什么只有20分

P1957 口算练习题

清风雪月 @ 2021-08-12 20:40:35

//eg
#include<bits/stdc++.h>
using namespace std;
int a,b,q,n,l,z;
char c;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>c;
        cin>>a>>b;
        if(c=='a'||c=='b'||c=='c')
        {
            c-=96;
            if(c==1)
            {
                cout<<a<<"+"<<b<<"="<<a+b<<endl;
                z=a+b;
            }
            else if(c==2)
            {
                cout<<a<<"-"<<b<<"="<<a-b<<endl;
                z=a-b;
            }
            else
            {
                cout<<a<<"*"<<b<<"="<<a*b<<endl;
                z=a*b;
            }
            int x1;
            x1=a;
            while(x1>0)
            {
                x1/=10;
                l++;
            }
            x1=b;
            while(x1>0)
            {
                x1/=10;
                l++;
            }
            x1=z;
            while(x1>0)
            {
                x1/=10;
                l++;
            }
            l+=2;
            cout<<l<<endl;
            q=c;
            l=0;
        }
        else
        {
            int x1,x2=0;
            x1=a;
            while(x1>0)
            {
                x1/=10;
                x2++;
            }
            a+=(c-48)*pow(10,x2);
            c=q;
            if(c==1)
            {
                cout<<a<<"+"<<b<<"="<<a+b<<endl;
                z=a+b;
            }
            else if(c==2)
            {
                cout<<a<<"-"<<b<<"="<<a-b<<endl;
                z=a-b;
            }
            else
            {
                cout<<a<<"*"<<b<<"="<<a*b<<endl;
                z=a*b;
            }
            x1=a;
            while(x1>0)
            {
                x1/=10;
                l++;
            }
            x1=b;
            while(x1>0)
            {
                x1/=10;
                l++;
            }
            x1=z;
            while(x1>0)
            {
                x1/=10;
                l++;
            }
            l+=2;
            cout<<l<<endl;
            q=c;
            l=0;
            z=0;
        }
    }
    return 0;
}

by 清风雪月 @ 2021-08-12 20:43:54

没有人吗?


by Terrible @ 2021-08-12 20:45:47

有,只不过你的程序写的有点啰嗦,大家不是很愿意给你改。


by 清风雪月 @ 2021-08-13 21:21:05

@Terrible 那我改了一下


by 清风雪月 @ 2021-08-13 21:21:44

```cpp
//eg
#include<bits/stdc++.h>
using namespace std;
int a,b,q,n,l,z,x1,x2;
char c;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>c;
        cin>>a>>b;
        if(c=='a'||c=='b'||c=='c'){
            c-=96;
            switch(c){
                case 1:z=a+b,cout<<a<<"+"<<b<<"="<<z<<endl;break;
                case 2:z=a-b,cout<<a<<"-"<<b<<"="<<z<<endl;break;
                case 3:z=a*b,cout<<a<<"*"<<b<<"="<<z<<endl;break;
            }
            x1=a;
            while(x1>0){
                x1/=10;
                l++;
            }
            x1=b;
            while(x1>0){
                x1/=10;
                l++;
            }
            x1=z;
            while(x1>0){
                x1/=10;
                l++;
            }
            cout<<l+2<<endl;
            q=c;l=0;
        }
        else{
            x1=a;x2=0;
            while(x1>0){
                x1/=10;
                x2++;
            }
            a+=(c-48)*pow(10,x2);c=q;
            switch(c){
                case 1:z=a+b,cout<<a<<"+"<<b<<"="<<z<<endl;break;
                case 2:z=a-b,cout<<a<<"-"<<b<<"="<<z<<endl;break;
                case 3:z=a*b,cout<<a<<"*"<<b<<"="<<z<<endl;break;
            }
            x1=a;
            while(x1>0){
                x1/=10;
                l++;
            }
            x1=b;
            while(x1>0){
                x1/=10;
                l++;
            }
            x1=z;
            while(x1>0){
                x1/=10;
                l++;
            }
            cout<<l+2<<endl;q=c;l=0;z=0;
        }
    }
    return 0;
}

by Terrible @ 2021-08-14 11:44:23

@清风雪月

今天0点才看到,故没有回。

这比最初的那个程序简练了。

问题:

1.读入两个数据的时候,如果第一个数只有1位,你的程序是不会输出的。有一个\color{red}\text{WA}是奇数行错了,应该是这种数据。

2.对于算式a-b,虽然题目保证a、b都是正的,可是没说a-b也是正的。如果减法结果是负的或者0,你的程序就错了。大多数\color{red}\text{WA}测试点的反馈是,你的偶数行错了,是这个原因。

其他建议:

1.

    if(c=='a'||c=='b'||c=='c'){
            c-=96;
            switch(c){
                case 1:...
              case 2:...
              case 3:...
            }

这个程序段c可以不必减去96,case 'a'即可。

2.

            x1=a;
            while(x1>0){
                x1/=10;
                l++;
            }

这个判断位数的方法有种种缺陷,它还不简练,可以写成函数的形式。

3.

if(c=='a'||c=='b'||c=='c')

对照ASCII表,其实可以写成

if(c>='a')

附上本人新写的代码:

#include<cstdio>
#include<cstring>
char s[200];
int main()
{
    int n,a,b;char c,d;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf(" %c",&d);
        if(d<'a')ungetc(d,stdin);else c=d;
        //ungetc(d,stdin)表示把刚读入的d撤回到读入区 
        //先看看第一个字符是不是字母,不是的话退回去
        //这样我们的程序就不必再写很多代码兼容两个数据的情况了 
        scanf("%d%d",&a,&b);
        switch(c)
        {
            case 'a':sprintf(s,"%d+%d=%d",a,b,a+b);break;
            case 'b':sprintf(s,"%d-%d=%d",a,b,a-b);break;
            case 'c':sprintf(s,"%d*%d=%d",a,b,a*b);break;
            //sprintf()是在printf()参数列前面加一个参数
            //表示将结果输出到一个字符串s里,其他用法和printf()
            //一模一样,就不必手动判断字符串长度了 
        }
        printf("%s\n%d\n",s,strlen(s));
        //strlen(s),s的长度 
    }
}
//学会用库函数很重要,库函数不是高高在上的存在
//有什么问题能用库函数解决的,就用库函数解决
//这(库函数、STL)都是大佬的代码,你要不要嘛?要不要? 

题外话:

第二个测试点:

Wrong Answer. wrong answer On line 21 column 2, read 7, expected 0.

(21行第2个字符,你给的结果是7,人家要0)

鼠标移到某个测试点上会返回信息,虽然是英文,但这个不难理解吧。得学会看WA的反馈信息。

有什么问题可以靠题解解决,能自己解决不要发帖。


by Terrible @ 2021-08-14 11:48:51

这里忘说一点了:

scanf(" %c",&c);

%c前面加空格这个语句等于cin>>c;会过滤掉 空格回车换行。

scanf("%c",&c);

则相当于c=getchar(),会读入下一个任意的字符,不会过滤。(至于为什么,不必深究)

图链接挂了,你右键打开便是。


by 清风雪月 @ 2021-08-14 17:48:09

@Terrible 谢谢大佬,讲解真的很详细,以后我做题会注意这些的,


by 清风雪月 @ 2021-08-14 17:54:50

我自学的,以前没学过STL和大多数库函数,也不知道是什么意思,看来以后这些也要去学学


|