PAT乙1057. 数零壹(20)
来源:互联网 发布:免费淘宝模板代码 编辑:程序博客网 时间:2024/06/06 01:45
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<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 0
- PAT乙1057. 数零壹(20)
- PAT - 1057. 数零壹(20)
- PAT 1057. 数零壹(20)
- 1057. 数零壹(20) PAT
- PAT(B) - 1057. 数零壹(20)
- PAT 乙级 1057. 数零壹(20)
- 1057. 数零壹(20) PAT 乙级
- PAT乙级 1057. 数零壹(20)
- PAT乙级 1057. 数零壹(20)
- [PAT乙级]1057. 数零壹(20)
- PAT乙级1057. 数零壹(20)
- pat 乙级 1057. 数零壹(20)
- PAT乙题1057. 数零壹(20)
- 1057. 数零壹(20)-PAT乙级真题
- PAT BASIC LEVEL 1057. 数零壹(20)
- PAT 乙级 1057.数零壹(20)
- 1057. 数零壹(20) PAT乙级真题
- PAT-B 1057. 数零壹
- Android开源框架简介
- muiH5前端框架和ssm后端框架开发移动混合app——过程
- 6-2 单链表结点删除(20 分)_单链表的删除节点的两种方式——还是双指针和链表覆盖好用
- 节食的限制(体积与权值相同的01背包)
- 使用Git拉取GitLab上的项目
- PAT乙1057. 数零壹(20)
- linux文件操作命令
- 淘宝联盟逆向笔记
- Ubuntu16.04 LTS 安装FFmpeg
- 单例模式
- HDU 4857
- markDown工具介绍
- 单例模式和工厂模式Demo简单演示
- 线程锁synchronized (this)锁住的是对象还是方法