HDoj 2030 汉字统计

Problem Description 统计给定文本文件中汉字的个数。  

 

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);
    }
}

 

 

上一篇:hdoj 2007 平方和与立方和


下一篇:HDOJ-2025-查找最大元素