PAT乙1057. 数零壹(20)

1057. 数零壹(20)
给定一串长度不超过105的字符串,本题要求你将其中所有英文字母的序号(字母a-z对应序号1-26,不分大小写)相加,得到整数N,然后再分析一下N的二进制表示中有多少0、多少1。例如给定字符串“PAT (Basic)”,其字母序号之和为:16+1+20+2+1+19+9+3=71,而71的二进制是1000111,即有3个0、4个1。
输入格式:
输入在一行中给出长度不超过105、以回车结束的字符串。
输出格式:
在一行中先后输出0的个数和1的个数,其间以空格分隔。
输入样例:
PAT (Basic)
输出样例:

3 4

分析:这道题本来很简单,但是我提交了很多次发现老是有错误,尝试了很多次之后,我发现了问题。我原来的代码用的是string和cin来输入字符串,改成用gets函数和char数组来输入就通过了,所以我猜测应该是空格的问题,测试用例中的字符串可能包括了空格,而cin会跳过空格,因此才总是报错,还有就是gets函数在vs2015等新编译器里会报错,因为gets函数是老标准,在新标准里已经被gets_s替换掉了,为了能通过PAT的老编译器,我们还是用gets函数。另外我还发现了一个小bug,我看了网上这道题几乎所有的代码都没有考虑到一种特殊情况,假如说字符串里一个英文字母都没有,全是一堆符号,那么序列和应该为0,最后输出的结果应该是1,0,而不是0,0。不过PAT好像也没有考虑到这种特殊情况,所以就都通过了,我下面的代码也就不考虑那种特殊情况了。

#include
#include
using namespace std;
int main()
{
	char s[100001];//字符串数组
	gets(s);//输入字符串
	int i,sum=0;
	for (i = 0; s[i]!='\0'; i++)
	{
		if (s[i] >= 65 && s[i] <= 90)//算出大写字母的序号并加到和里去
			sum += s[i] - 64;
		if (s[i] >= 97 && s[i] <= 122)//算出小写字母的序号并加到和里去
			sum += s[i] - 96;
	}
	int result[2] = { 0 };//result[0]表示0的个数,result[1]表示1的个数
	while (sum)//利用除二取余法来统计出0,1的数量
	{
		result[sum % 2]++;
		sum /= 2;
	}
	cout << result[0] << " " << result[1];
}




你可能感兴趣的:(PAT乙级题目部分解析)