[打基础]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 }