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;
}

个人博客:陪你一起终身学习!|岳金钊&个人博客


posted @ 2017-11-04 13:23  Honyelchak  阅读(204)  评论(0)    收藏  举报