非官方题解
2025-04-08 18:26:19
发布于:北京
1阅读
0回复
0点赞
先写输入。
注意,字符串中含有空格,所以需要使用按行输入的函数进行读取。这里我推荐大家使用 std::getline ()
函数,如下:
std::string s;
std::getline (std::cin, s);
而空格位置上要替换的字母由这是第几个空格来决定,所以我们可以使用 cnt
变量,用来记录当前是第几个空格。
如果当前字符是空格,那么 cnt ++;
,然后进行替换,这里我使用了 static_cast <char> ()
函数,其功能是将给定的 ASCII
码转换成其所对应的字符。
考虑到要转换的是大写字母,所以 cnt += 'A'
,这里注意:为了防止超出范围,我们需要对其进行取模。我写的 cnt
是从 1
开始的,所以还需要减 1
。为了简洁,我写了一个函数:
char num_to_let (int x)
{
int asc = x % 26 + 'A' - 1;
char ans = static_cast <char> (asc);
return ans;
}
这里我发现了一个小问题,当 x
等于26时,它返回的是 @
, 而不是 Z
,不知为何,懂的给我讲一下,所以我直接写了一个特判:
char num_to_let (int x)
{
int asc = x % 26 + 'A' - 1;
char ans = static_cast <char> (asc);
return (ans == '@'? 'Z' : ans);
}
主函数部分怎么写,上面说过了,就是简单的把字符串 s
遍历一遍,是空格就转换,计数器加 1。
C++ Code:
#include <bits/stdc++.h>
//using namespace std;
const int N = 1e5 + 10, M = 1e2 + 10;
char num_to_let (int x)
{
int asc = x % 26 + 'A' - 1;
char ans = static_cast <char> (asc);
return (ans == '@'? 'Z' : ans);
}void solve ()
{
//main;
std::string s; std::getline (std::cin, s);
int cnt = 1;
int len = (int) s.length ();
for (int i = 0; i < len; ++ i)
{
if (s[i] == ' ')
{
s[i] = num_to_let (cnt);
cnt ++;
}
}std::cout << s << std::endl;
return ;
}int main ()
{
//main;
int T = 1; //cin >> T;
while (T --)
solve ();
return 0;
}
这里空空如也
有帮助,赞一个