1057 数零壹 (20 point(s))

#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() 函数就可以了。

transform()

1057 数零壹 (20 point(s))

上一篇:关闭未保存弹出提示框


下一篇:JUC进阶