#include <bits/stdc++.h>
using namespace std;
int main() {
// 数N表示成二进制的1 0 个数
int zero = 0, one = 0, N = 0;
string str;
// 可能有空格
getline(cin, str);
// 遍历字符串
for(auto s : str){
// 不分大小写
if(isalpha(s)){
// 英文序号相加 1-26 => N
N += toupper(s) - ‘A‘ + 1;
}
}
//cout << N;
while(N){
if(N % 2) one++;
else zero++;
N /= 2;
}
cout << zero << " " << one;
}
当时看这个进制转换的时候犹豫了一下,不记得是不是要把 while 改成 do_while 了。试了下好像没什么问题。放在开头就可以了。
不过这题循环还是得先判断一次。如果 N = 0 的话,那么就会进入循环处理一次。得到一个 0 。 但显然我们本来是没有字母出现,根据题目条件“若字符串中不存在字母,则视为 N 不存在,也就没有 0 和 1”,这就跟结果不符。
所以循环条件的位置跟是否执行一次有关,不执行放前面,执行一次放后面。
之前有一个 科学计数法 的题目,当时写的时候除了循环条件的判断之外,还有一个问题在于如果循环条件的变量涉及自增自减 ++ 或 -- 的话,又得额外考虑。不过这不是本题的范畴,就不管了。
看了看别人有什么更好的方法,似乎差不多,题目也不难。看到一个新的函数 transform() 可以将字符串转换成大写或者小写。只需要在里面三个位置分别放上字符串首尾地址,用 begin() 和 end() 即可,然后第三个位置放一个 tolower() 和 toupper() 函数就可以了。