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)
还没有任何评论哟~
