杭电ACM 2030:汉字统计|解决

1,148次阅读
没有评论

1、原题描述:

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

Input

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

Output

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

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

Sample Input

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

Sample Output

14
9

2、题目分析:

难点在于如何接受一段字符串,这里可以看我的数组接受字符串输入,并且遍历判断是否是汉字。汉字有个特点,一般是两个字节组成,汉字的unicode构成可以可看汉字Unicode。每个字节的首位都是1,转成unicode值,那就是负数,所以可以拿这个特性来判断是否是汉字。

3、AC代码:

#include<iostream>
#include<stdio.h>
#include<string.h>

using namespace std;

int main()
{
    int n;
    char arr[1000];
    cin>>n;
    getchar();
    while(n--)
    {
        int sum=0;
        gets(arr);
        int len;
        len=strlen(arr);

        for(int i=0;i<len;i++)    //汉字的编码为与ASCII码区分,首位为1,切占16位
        {
            if(arr[i]<0)      // 是否小于0,
                sum++;
        }
        printf("%d\n",sum/2);    // 一个汉字是两个字节
    }
    return 0;
}

由于数组是 char 类型,所以一个汉字会占用两个位置,所以最后的数量在除以2,但是奇怪的是 Mac 下需要除以3,好奇怪。

总结:

学习了汉字的内部结构,汉字的两个字节对应的 int 值都是负数。That's all.

参考文章:

https://blog.csdn.net/gui951753/article/details/46993667

https://blog.csdn.net/yaomingyang/article/details/79374209

1
西园公子
版权声明:本站原创文章,由西园公子2021-03-04发表,共计861字。
转载提示:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
载入中...