HDU - 2030 汉字统计
题目
统计给定文本文件中汉字的个数。
Input
输入文件首先包含一个整数n,表示测试实例的个数,然后是n段文本。
Output
对于每一段文本,输出其中的汉字的个数,每个测试实例的输出占一行。
[Hint:]从汉字机内码的特点考虑~
Sample Input
2
WaHaHa! WaHaHa! 今年过节不说话要说只说普通话WaHaHa! WaHaHa!
马上就要期末考试了Are you ready?
Sample Output
14
9
想法
汉字内码在计算机中是双字节存储。
java中 char 可以存储两个字节,但是c中char只能存储一个字节。
在计算机中,汉字使用二个字节,每个字节最高位一位为1。 计算机中,补码第一位是符号位,1 表示为 负数。所以 汉字机内码的每个字节表示的十进制数都是负数。英文的一个字一个字节用了8位(1个字节)
汉字的一个字两个字节用了16位(2个字节)
java代码
代码① :
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner it = new Scanner(System.in);
int n=it.nextInt();
it.nextLine();
while(it.hasNext()) {
if(n==0)break;n--;
String s=it.nextLine();
int sum=0;
char a[]=s.toCharArray();
for(int i=0;i<a.length;i++) {
if(a[i]<0||a[i]>255)sum++;
}
System.out.println(sum);
}
}
}
代码 ② :转换为字节数组
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner it = new Scanner(System.in);
int n=it.nextInt();
it.nextLine();
while(it.hasNext()) {
if(n==0)break;n--;
String s=it.nextLine();
int sum=0;
byte a[]=s.getBytes();
for(int i=0;i<a.length;i++) {
if(a[i]<0)sum++;
}
System.out.println(sum/2);
}
}
}
代码③:汉字内码范围
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner it = new Scanner(System.in);
int n =it.nextInt();
it.nextLine();
while(n-->0) {
String s = it.nextLine();
char a[]=s.toCharArray();
int sum=0;
for(int i=0;i<a.length;i++){
if(a[i] >= 0x0391 && a[i] <= 0xFFE5)
sum++;
}
System.out.println(sum);
}
}
}
c代码
#include<stdio.h>
#include<string.h>
int main()
{
int n;
while(scanf("%d",&n)!=EOF){
getchar();
char a[1000];
for(int i=0;i<n;i++){
gets(a);
int sum=0;
for(int i=0;i<strlen(a);i++)
if(a[i]<0)sum++;
printf("%d\n",sum/2);
}
}
return 0;
}

浙公网安备 33010602011771号