[打基础]luogu1957口算练习题——字符串基本操作

题意:第一行给出数据组数n,之后n行每行给出三个或两个数据,若给三个数据,则第一个数据用单个字符a/b/c分别表示+/-/*运算,后两个数表示参与运算的数字,若给两个数据延续之前的运算

要求对每行数据输出对应的计算表达式(如a 1 2输出1+2=3)和表达式的长度


 

我啥都忘记…


 

思维上没有难度,几个小的地方处理清楚

  • 比如对于每行两个数据还是三个数据的判定可以先读入两个数据p,q(默认当做参与运算的数字),再getchar一下,如果得到\n或者\r说明行尾了,如果是空格后面还有一个数据,那就应该让运算符变成第一个p,实际上的p应该是读到的q,然后q另外再读一个。这里用到 strcpy(p,q); 来用q覆盖p
  • 再然后是把字符串弄成数字,应该没问题,如果是负数判个负号(不过这题甚至都保证非负),接着从高位往低位逐位求和就行
  • 最后用一个新字符串保存要输出的表达式,用 strcat(p,q); 把q接到p的后面,计算结果直接当数字输出,最后输出长度的时候用 strlen(表达式)+答案长度 
  • 然后要说的是我第一次交的时候wa掉的地方…如果答案是0的话长度是1…特别提醒
 1 #include<cstdio>
 2 #include<cstring>
 3 const int N=105;
 4 int l,f,m,n,ans;
 5 char p[N],q[N],r[N],pri[N];
 6 inline void work(char *t,int *g)
 7 {
 8     *g=0;
 9     int len=strlen(t);
10     for(register int i=0;i<len;i++)*g=*g*10+t[i]-'0';
11 }
12 inline int calc(int g)
13 {
14     int res=0;if(g<=0)res++,g=-g;
15     /*
16     attention!
17     if g equal to,res should be 1 not 0; 
18     */
19     while(g){g/=10;res++;}
20     return res;
21 }
22 int main()
23 {
24     //freopen("input.in","r",stdin);
25     scanf("%d",&l);f=-1;
26     while(l--)
27     {
28         scanf("%s%s",p,q);char c=getchar();
29         if(c==' ')
30         {
31             strcpy(r,p);strcpy(p,q);
32             scanf("%s",q);
33             f=r[0]-'a';
34         }
35         work(p,&m);work(q,&n);
36         
37         strcat(pri,p);
38         if(f==0)ans=m+n,strcat(pri,"+");
39         else if(f==1)ans=m-n,strcat(pri,"-");
40         else if(f==2)ans=m*n,strcat(pri,"*");
41         strcat(pri,q);strcat(pri,"=");
42         
43         printf("%s%d\n",pri,ans);
44         printf("%d\n",strlen(pri)+calc(ans));
45         memset(pri,0,sizeof(pri));
46     }
47     return 0 ;
48 }

 

posted @ 2020-08-23 02:04  yoshinow2001  阅读(206)  评论(0编辑  收藏  举报