题解 P1957 【口算练习题】
作为一个蒟蒻,我之前仿佛没有看见有用字符串函数做的…
----------------------------------------------------我假装这是条分割线---------------------------------------------------------
在此隆重推出
#include <cctype>
这是一个拥有许多字符串处理函数声明的头文件,这些函数可以用来对单独字符串进行分类和转换;
例如:
isalpha():检查这个字符是否为字母,真返回1,假返回0;
isalnum():检查这个字符是否为字母或数字数字,同上;
isdigit():检查这个字符是否为十进制数字,同上;
islower():检查这个字符是否为小写字母,同上;
剩下自己百度去吧~~逃……
----------------------------------------------------我假装这还是条分割线------------------------------------------------------
现在来看一下这道题:
1.输入
因为这道题输入要求为“接着的i行为需要输入的算式,每行可能有三个数据或两个数据。” 因为不确定第一个数据的类型,所以要用
字符串!字符串!字符串!
为了快一点 我用了scanf:
for(int i=1; i<=n; i++) {
scanf("%s",&ss);}
2.处理
已经输入了之后,第一步要判断是“三个数据”还是“两个数据”;
而它的标志是什么呢,就是输入的字符串的第一个字符!
一定记住是ss[0]!! 因为这个,样例卡了一刻钟……
判断它是否是个字母,cctype就可以派上用场了:
if(isalpha(ss[0])) {
k=ss[0];
scanf("%d%d",&x,&y);
}
如果不是呢,之前的许多大佬都用过:
atoi ((表示 ascii to integer)是把字符串转换成整型数的一个函数)
直接将输入的字符串转成整数,再输入第二个数就可以啦:
else {
x=atoi(ss);
scanf("%d",&y);
}
3.输出
题目要求我们输出这个输出的算式的长度,怎么办呢?
在此向大家推出:
sprintf()
或许看起来很像printf?实际上,他只比printf多一个参数,一个字符串!
没错,他就是一个将数据输入字符串的函数!
那长度直接输出ans的长度就可以啦。
代码:
if(k=='a')
sprintf(ans,"%d+%d=%d",x,y,x+y);
else if(k=='b')
sprintf(ans,"%d-%d=%d",x,y,x-y);
else
sprintf(ans,"%d*%d=%d",x,y,x*y);
printf("%s\n%d\n",ans,strlen(ans));
4.代码
//具体细节前面都有讲
#include <cctype>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
int n,x,y;
char ss[20],ans[100],k;
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++) {
scanf("%s",&ss);
if(isalpha(ss[0])) {
k=ss[0];
scanf("%d%d",&x,&y);
} else {
x=atoi(ss);
scanf("%d",&y);
}
if(k=='a')
sprintf(ans,"%d+%d=%d",x,y,x+y);
else if(k=='b')
sprintf(ans,"%d-%d=%d",x,y,x-y);
else
sprintf(ans,"%d*%d=%d",x,y,x*y);
printf("%s\n%d\n",ans,strlen(ans));
}
return 0;//完美结束!
}```
逃……