这篇博客是从旧博客 WordPress 迁移过来,内容可能存在转换异常。
题目地址:
http://acm.hdu.edu.cn/showproblem.php?pid=1736
粗略一看以为是要用wchar_t和wcin,wcout输入输出,可是看来错了。。。。
在题目看面有这么一个Hint:
你可以认为所有中文字符由两个字节组成,首字节的ASCII值都大于127(也可以理解为signed char型小于0) 意思就是直接用char保存,当检测到第一个是小于0时,再检测第二个,把把第一个和第二个组成中文字。
这里不光考察了这些,还考察了细心。
给好多一直WA的朋友一组数据大家就知道自己为何WA了(对于大部分应该都是这里错了):
“ddddd"ddddd"ddddd”(输入包括第一个和最后一个双引号,第一个和最后一个是中文的引号,中间2个是英文的引号)
大家看懂没?第一个字符是中文的"“"
最后一个也是中午的"”"
那么输出应该是: “ddddd”ddddd“ddddd”
大家看看自己是不是这里只考虑了遇到" " "或 " " " 才变的。
OK,给代码了:
// Accepted 1736 0MS 1208K 1464 B C++ Tanky Woo
#include
#include
using namespace std;
int main()
{
//wchar_t ch;
//wcin.imbue(locale("chs")); //这里不能用wchar_t来输入输出汉字
//wcout.imbue(locale("chs"));
int flag = 0; // 0表示左边,1表示右边
char article[1000000];
while(gets(article) != NULL)
{
flag = 0;
int len = strlen(article);
for(int i=0; i<len; ++i)
{
string tmp ;
tmp = tmp+article[i] + article[i+1]; // 这里判断是否遇到了"“"或"”"
if(tmp=="“" || tmp=="”")
flag = !flag;
if(article[i] == ',')
cout << ",";
else if(article[i] == '.')
cout << "。";
else if(article[i] == '!')
cout << "!";
else if(article[i] == '"')
{
if(flag == 0)
cout << "“";
else
cout << "”";
flag = !flag;
}
else if(article[i] == '<' && article[i+1]=='<')
{
cout << "《";
i++;
}
else if(article[i] == '>' && article[i+1]=='>')
{
cout << "》";
i++;
}
else if(article[i] == '?')
cout << "?";
else
cout << article[i];
}
cout << endl;
}
return 0;
}