码迷,mamicode.com
首页 > 其他好文 > 详细

HDoj 2030 汉字统计

时间:2020-03-28 23:50:13      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:条件   进制   ==   包含   符号   bsp   field   seve   国标码   

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

 

Input
输入文件首先包含一个整数n,表示测试实例的个数,然后是n段文本。
 

 

Output
对于每一段文本,输出其中的汉字的个数,每个测试实例的输出占一行。

[Hint:]从汉字机内码的特点考虑~

 

 

Sample Input
2 WaHaHa! WaHaHa! 今年过节不说话要说只说普通话WaHaHa! WaHaHa! 马上就要期末考试了Are you ready?
 

 

Sample Output
14 9
 

 

Author
lcy
 

 

Source
 

 

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 2030 汉字统计

标签:条件   进制   ==   包含   符号   bsp   field   seve   国标码   

原文地址:https://www.cnblogs.com/wzmm/p/12590058.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!