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.
参考文章: