Flowers Flourish from France 题解

题目传送门1 || 题目传送门2

题目大意

编写一个程序,检查输入的每个句子是否所有单词的首字母相同(忽略大小写),如果是则输出 Y,否则输出 N。输入以 * 结束。

输入有多个句子,每个句子由不超过 \(50\) 个单词组成,单词之间用单个空格分隔。

每个单词由不超过 \(20\) 个英文字母(大小写均可)组成,且至少包含一个字母。

解题方法

输入

由于这里要输入一整行,且中间有空格,可以使用 getline 来逐行读取输入。只要输入为 *getline 不会读取末尾回车哦)就跳出。

统一字母大小写

为了方便后续比较,可以将所有字母转为大写(或小写)。这里将所有字符改为大写,通过 s[i] -= ' ' 将小写字母转为大写(ASCII 特性)。

for (int i = 0; i < s.size(); i++)
    if (s[i] >= 'a' && s[i] <= 'z') s[i] -= ' ';

检查首字母

  • 建立几个变量,这里 tot 用来记录第一个单词的首字母,flag 用来记录所有单词首字母是否相同。
  • 首先用变量 tot 记录第一个单词的首字母(即 s[0])。
  • 然后遍历句子,每当遇到空格时,检查下一个字符是否为 tot
  • 如果发现不一致,设置 flag = 1 并提前退出循环。
char tot = s[0];
bool flag = 0;
for (int i = 1; i < s.size(); i++) {
	if (s[i - 1] == ' ' && s[i] != tot) {
		flag = 1;
		break;
	}
}

完成这几个部分以后,这道题就可以很轻松解决了~

参考代码

#include<bits/stdc++.h>
#define int long long
#define rint register long long
#define fast_running ios::sync_with_stdio(false),std::cin.tie(0),std::cout.tie(0);
using namespace std;

signed main() {
    fast_running;
    string s;
    while (1) {
        getline(cin, s);  // 读取一行输入
        if (s == "*") break;  // 遇到 "*" 结束输入

        // 将所有字母转为大写(方便比较)
        for (rint i = 0; i < s.size(); i++) {
            if (s[i] >= 'a' && s[i] <= 'z') s[i] -= ' ';
        }

        char tot = s[0];  // 记录第一个单词的首字母
        bool flag = 0;    // 标记是否出现不一致的情况

        // 遍历句子,检查每个单词的首字母
        for (rint i = 1; i < s.size(); i++) {
            if (s[i - 1] == ' ' && s[i] != tot) {  // 遇到空格后的字母与 tot 不同
                flag = 1;
                break;
            }
        }

        // 输出结果
        if (flag == 0) cout << "Y\n";
        else cout << "N\n";
    }
    return 0;
}

~ 完结撒花 ~

posted @ 2025-05-05 08:19  绪风ﺴﻬৡ  阅读(12)  评论(0)    收藏  举报