Advertisement

PAT乙1057. 数零壹(20)

阅读量:

1057. 数零壹(20)

请在一行内输入不超过105个字符的字符串,并以回车键结束。输入格式: 请在一行内输入不超过105个字符的字符串,并以回车键结束。输出格式: 请输出二进制表示中0的数量以及1的数量,并用空格分隔这两个数字。输入样例: 比如对于字符串‘PAT (Basic)’来说,请计算其中所有英文字母对应的序号总和。(计算过程)转换为二进制后得到的结果中有3个零位和4个一。

3 4

分析:这道题本来很简单,在反复提交的过程中遇到了诸多错误。通过多次尝试后发现了问题所在。最初使用的代码基于string类型和cin输入操作存在缺陷,在这种情况下程序无法正常运行。改用gets函数和char数组进行输入后程序顺利运行,并且这一改动也解决了原本存在的潜在问题——即测试用例中可能存在包含空格的情况(因为使用cin时会自动忽略前后多余的空格),而使用gets函数则能够正确处理这一情况(在vs2015等新编译器环境中)。值得注意的是PAT评测系统似乎并未考虑到这种特殊情况(即当字符串中没有任何英文字母时的极端情况),因此在这种情况下的序列求积应为0而非1。为了避免不必要的麻烦,在此代码中将不再处理这种情况的特殊处理逻辑。

复制代码
 #include<iostream>

    
 #include<stdio.h>
    
 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];
    
 }

全部评论 (0)

还没有任何评论哟~