分数 20
作者 CHEN, Yue
单位 浙江大学
给定一串长度不超过 10^5的字符串,本题要求你将其中所有英文字母的序号(字母 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。
输入格式:
输入在一行中给出长度不超过 10^5、以回车结束的字符串。
输出格式:
在一行中先后输出 0 的个数和 1 的个数,其间以空格分隔。注意:若字符串中不存在字母,则视为 N 不存在,也就没有 0 和 1。
输入样例:
PAT (Basic)
输出样例:
3 4
注意
- scanf遇到空格停止接收 改用gets
- 求二进制就%2再/2即可
- 需要计多个数,用数组方便点,因为有指标。
代码实现
#include<stdio.h>
#include<string.h>
#include<ctype.h>
int main(){
char str[100010];
// scanf("%s",str);//遇到空格会停止接收
gets(str);
int sum = 0;
int len = strlen(str);
printf("%d\n",len);
int count[2] = {0};
for(int i = 0; i < len ; i++){
if(islower(str[i])){
sum += str[i] - 'a' + 1;
}
else if(isupper(str[i])){
sum += str[i] - 'A' + 1;
}
}
while(sum != 0){
count[sum%2]++;
sum = sum/2;
}
printf("%d %d",count[0],count[1]);
}