计算机能力挑战初赛2020.18题
题目描述:
"输入一行由字符a~z和A~Z组成的字符串,字符串长度<=10000,
求其中任意两个字符出现次数的差值的绝对值
输入: 第一行输入字符串 第二行输入两个字符。
输出: 输出这两个字符出现次数的差值的绝对值
输入样例: AbddeDfacd A d
输出样例: 2
(解释:字符串中字符'A'出现了2次,字符'd'出现了4次,则结果为|2-4|=2)"
题目分析:
cpp
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(void) {
char str[10002];
scanf("%s", str);
char A;
char B;
A = getchar();
B = getchar();
int a = 0;
int b = 0;
int i;
for (i = 0; i < strlen(str); i++) {
if (str[i] == A || str[i] == A + 32 || str[i] == A - 32) {
a++;
}
if (str[i] == B || str[i] == B + 32 || str[i] == B - 32) {
b++;
}
}
printf("%d", abs(a - b));
return 0;
}
一开始代码如上,然而调试后发现scanf("%s")虽然不会接收回车键,但会将回车留在缓冲区。
这里可以使用getchar()来将换行吞掉。
然而接下来出现的问题是输入a之后的空格仍会被getchar()读取。
因此再次用getchar()吞掉空格。
最终代码:
cpp
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(void) {
char str[10002];
scanf("%s", str);
char A;
char B;
getchar();
A = getchar();
getchar();
scanf("%c", &B);
int a = 0;
int b = 0;
int i;
for (i = 0; i < strlen(str); i++) {
if (str[i] == A || str[i] == A + 32 || str[i] == A - 32) {
a++;
}
if (str[i] == B || str[i] == B + 32 || str[i] == B - 32) {
b++;
}
}
printf("%d", abs(a - b));
return 0;
}