题目描述
Alice的记忆力不太好,如果一个句子中含的单词(每个单词之间用一个空格隔开)数量超过10,或者句子中字母种类(不区分大小写)超过10个,她就会记不住。现在给你若干个句子,请写个程序判断一下Alice是否能记住这些句子。
输入
存在多个样例。
每行输入一个字符串,表示句子。字符串长度不超过200,只含英文字母和空格。
输入数据保证每个单词之间只有一个空格,行末没有空格。输出
对于每个样例,能记住,输出“Yes”,否则输出“No”。
样例输入
Alice is a smart girl but she is bad in memory a b c d e f g h i j A B C D E F G H I J K样例输出
Yes No Yes No
解题思路:gets() 输入,数组遍历
本题一不知道输入长度,二字符串中又有空格,所以 scanf("%c"),scanf("%s") 好像都不能用,所以要换 gets() 输入,而又问 好像我以前的代码 都会加一个 scanf() != EOF 这次为什么 是 gets() != NULL 了?因为 scanf() 和 gets() 都有一个返回值,而两者返回值类型又是不一样的,具体的自行查找。
输入之后,剩下的只需要遍历一遍数组,记录 出现的空格数 和 出现过的字符种类数。如果任意一个超过条件,则输出 No,否则输出 Yes。
AC代码:
#include <stdio.h>
#include <string.h>
int cnt1, cnt2, len;
char str[210];
int main()
{
while ( gets(str) != NULL)
{
bool books[30] = {0};
cnt1 = cnt2 = 0;
len = strlen(str);
for (int i = 0; i < len; i ++)
{
if (str[i] == ' ') {cnt1 ++; continue;}
if (str[i] >= 97) str[i] -= 32; // ASCII码,统一字符为大写
if (!books[str[i]-'A']) cnt2 ++;
books[str[i]-'A'] = true;
}
if (cnt1 >= 10 || cnt2 >= 11)
puts("No");
else puts("Yes");
}
return 0;
}