Input 输入文件首先包含一个整数n,表示测试实例的个数,然后是n段文本。
Output 对于每一段文本,输出其中的汉字的个数,每个测试实例的输出占一行。
[Hint:]从汉字机内码的特点考虑~
Sample Input 2 WaHaHa! WaHaHa! 今年过节不说话要说只说普通话WaHaHa! WaHaHa! 马上就要期末考试了Are you ready?
Sample Output 14 9
Author lcy
Source C语言程序设计练习(五)
Recommend lcy | We have carefully selected several similar problems for you: 2031 2032 2033 2034 2036 本题考查了汉字的机内码以及位运算
1机内码: 中文或西文信息在计算机系统中的代码表示称为机内码。ASCII码是一种西文机内码,用一个字节表示,其最高位均为0。汉字机内码用连续两个字节表示,为能和ACSII符号区分,每个字节的最高位是1。机内码和国标码的转换规则是:机内码 = 国标码+8080H =(区位码的十六进制表示)+A0A0H。显然,就是将国标码的两个字节的最高位均置为1即可。(转自csdn)
2如何区分中文机内码和西文机内码: 很显然,中文机内码每个汉字用连续的两个字节表示,且每个字节的最高位(也就是第8位)为1,而西文都是0,所以可以通过位运算辨别出来:
a 当第八位为1的字节与128位相与时,必然是10000000,也就是128
b当第八位为1的字节右移时此时要知道: 在C语言中
有符号数左移是逻辑左移,右移是算数右移。
无符号数左移右移都是逻辑的
逻辑左移和右移移出的空位都补0
算数左移都补0,算数右移补的是符号位,负数补1,正数补0
所以:因为要右移7位。这个7默认是int型,所以字节也变成了有符号数。字节的最高位又为1,说明是个负数,所以当右移7位时是算数右移,补1,必然是11111111。换算成有符号十进制整数也就是:-1
有了上述的两个判断条件,任意选择其一即可。
C语言代码如下:
#include<stdio.h> #include<string.h> int main() { int n=0; int num; scanf("%d",&n); getchar(); char s[200]; for(int i=0;i<n;i++) { num=0; gets(s); for(int j=0;j<(int)strlen(s);j++) { // printf("%d %d %d %d\n",s[j],s[j]&128,s[j]>>7 ,strlen(s)); //测试用句 if((s[j]&128)==128) //if((s[j]>>7)==-1) //两个式子都要加括号,经过测试发现位运算符'&','>>'的优先级小于双目运算符'==' num++; } printf("%d\n",num/2); } }