题目:
汉字统计
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 30589 Accepted Submission(s): 16770
[Hint:]从汉字机内码的特点考虑~
2 WaHaHa! WaHaHa! 今年过节不说话要说只说普通话WaHaHa! WaHaHa! 马上就要期末考试了Are you ready?
14 9
什么是汉字机内码?
答:机内码,就是用二个字节,最高位为1,用它来表示一个汉字,在用到这个字时,系统按这个编号去找它的点阵信息,然后把它显示出来
汉字机内码在计算机的表达方式的描述是:
使用二个字节,每个字节最高位一位为1.
计算机中,补码第一位是符号位,1 表示为负数,所以汉字机内码的每个字节表示的十进制数都是负数
所以这题也就可以简化为输入字符串判断其中字符转化为十进制数是否小于零.
汉字是有两个小于零的字符组成,所以在统计结果的时候就要将count除以2了.
getcahr()函数:
getchar有一个int型的返回值.
当程序调用getchar时.程序就等着用户按键.
用户输入的字符被存放在键盘缓冲区中.
直到用户按回车为止(回车字符也放在缓冲区中).
当用户键入回车之后,getchar才开始从stdin流中每次读入一个字符.
getchar函数的返回值是用户输入的第一个字符的ASCII码,如出错返回-1,且将用户输入的字符回显到屏幕.
如用户在按回车之前输入了不止一个字符,其他字符会保留在键盘缓存区中,等待后续getchar调用读取.
也就是说,后续的getchar调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完为后,才等待用户按键.
注意:
如果输入的是中文字符,由于汉字是两个字节,所以getchar()函数对汉字要处理两次.比如我输入2个汉字,getchar()处理4次,返回4个值,由于是中文返回的肯定是负数.
ac代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
char s[100010];
int main()
{
int count,t,i,flag=1;
char c;
scanf("%d",&t);
while(t--)
{
if(flag)
{
getchar();
flag=0;
}
count = 0;
while ((c = getchar())!= '\n')
{
if (c < 0) count++;
}
printf("%d\n", count / 2);
}
return 0;
}