HDOJ 2030漢字統計(この問題でASCIIコードと漢字機内コードについて述べる)

1939 ワード

ASCIIコードと漢字機内コード:
HDOJ 2030の漢字の統計をする1題の中で討論区で漢字のASCIIコードの値がマイナスだとスレ主があることを見ます.しかし、本のASCIIコードの範囲は0-255(うち0-127は国際共通標準コード、128-255は拡張コード)である.
大牛に教えてもらって資料を調べたところ、漢字にはASCIIコードはなく、漢字はまた機内コードで表されている.すなわちansiコードは、現在の地域に基づいてシステムが確定した現地コードであり、例えば大陸のansiコードは国標コードGBKコードを代表している.各地域間の機内コードには違いがあります.
漢字イントラコードのコンピュータでの表現は、2バイトを用いて、各バイトの最上位1ビットが1であると記述されている.コンピュータでは,符号化第1ビットは符号ビットであり,1は負数を表すので,漢字機内符号のバイト毎に示す十進数は負数である.したがって、統計入力文字列にはいくつかの漢字が含まれており、文字列の中で0未満の文字がいくつかあるだけである.
注:英語の1文字1バイトは8ビット(1バイト)漢字の1文字2バイトは16ビット(2バイト)
次はテーマです.簡単です.

漢字統計


Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 30201    Accepted Submission(s): 16568
Problem Description
指定したテキストファイル内の漢字の個数を統計します.
 
Input
入力ファイルには、まず、テストインスタンスの個数を表す整数nが含まれ、次にnセグメントテキストが含まれます.
 
Output
各テキストについて、その中の漢字の個数を出力し、各テストインスタンスの出力は1行を占めます.
[Hint:]漢字機内コードの特徴から~
 
Sample Input

   
   
   
   
2 WaHaHa! WaHaHa! WaHaHa! WaHaHa! Are you ready?

 
Sample Output

   
   
   
   
14 9

 
上記から、ゼロ未満の文字を直接見つけることができるのが漢字です.
具体的なコードは以下の通りです.
#include<cstdio>
#include<cstring>
int main()
{
    int len,i,n;
    char str[1010];
    scanf("%d",&n);
    getchar();
    while(n--)
    {
        int count=0;
        gets(str);
        len=strlen(str);
        for(i=0;i<len;i++)
        {
            if(str[i]<0)
              count++;
        }
        printf("%d
",count/2); }// , , , return 0; }