本文主要是介绍航电ACM [hdu 2030] 汉字统计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
汉字统计
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 22294 Accepted Submission(s): 12144
Problem Description
统计给定文本文件中汉字的个数。
Input
输入文件首先包含一个整数n,表示测试实例的个数,然后是n段文本。
Output
对于每一段文本,输出其中的汉字的个数,每个测试实例的输出占一行。
[Hint:]从汉字机内码的特点考虑~
Sample Input
2
WaHaHa! WaHaHa! 今年过节不说话要说只说普通话WaHaHa! WaHaHa!
马上就要期末考试了Are you ready?
Sample Output
14
9
分析
1、汉字机内码,又称“汉字ASCII码”,简称“内码”,指计算机内部存储,处理加工和传输汉字时所用的由0和1符号组成的代码。输入码被接受后就由汉字操作系统的“输入码转换模块”转换为机内码,与所采用的键盘输入法无关。机内码是汉字最基本的编码,不管是什么汉字系统和汉字输入方法,输入的汉字外码到机器内部都要转换成机内码,才能被存储和进行各种处理。
2、每个汉字机内码使用二个字节,每个字节最高位一位为 1 。计算机中,补码第一位是符号位, 1 表示为 负数,所以,汉字机内码的每个字节表示的十进制数都是负数,统计输入字符串含有几个汉字,只只需求出字符串中小于 0 的字符有几个,将它除以 2 就是汉字的个数。
3、C / C++ 中,char 类型占 1 个字节,Java 中char 类型占 2 个字节。因为 Java 中无论是汉字还是英文字母都是用 Unicode 编码来表示的,一个 Unicode 码是 16 位,每字节是 8 位,所以一个 Unicode 码占两字节。但是英文字母比较特殊,源自于 8 位(1 字节)的 ASCII 码,于是在 Unicode 码仅使用了低 8 位(1 字节)就可以表示,高 8 位的话不使用也无所谓。所以,在这里不能使用 char 类型判断汉字机内码,需要使用 byte 类型。
算法代码
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int n = scanner.nextInt();scanner.nextLine();while (n-- != 0) {String str = scanner.nextLine();byte[] bys = str.getBytes();int count = 0;for (int i = 0; i < bys.length; i++) {if (bys[i] < 0) count++;}System.out.println(count / 2);}}}
这篇关于航电ACM [hdu 2030] 汉字统计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!