中文字符的简单处理。。。
三体代码问题分析。
粗过题意,即理解为统计出现次数最多的四个中文汉字。
该题难点在于中文汉字的编码问题
故想要做出该题来,需要了解一部分中文汉字在计算机中编码中的相关知识。
一,
基本思路:将该段文字传入一个char类型数组中,然后再开一个相应的计数数组。
遇到标点符号,进行跳过处理,continue。遇到与前方相同的汉字,在相应的计数数组中,次数加1.再把相同汉字替换为中文标点符号,例如中文句号。
即在遍历之后,该段文字变成只保留汉字第一次出现的,无重复的(重复的已经变成了句号)。
二,
问题简化:即不考虑次数相同的情况。
三,
遇到的问题,即注意事项:1.输出汉字时需要%c%c连用,不然会出现???
例如,printf("%c%c",s1[i],s1[i+1]);
2.汉字与英文单词有所不同的是,汉字由两个char组成。故一个跨度为+2。
3.具体汉字的编码需要在具体的计算机上测试出,网上的有些,不适用,实践出真知,不要盲目信网上的(浪费我好长时间)。
/*
他采取的加密方式是使用“不要回答”4个汉字的二进制编码依次
替换了叶文洁所发送的信息(不包括标点符号)中出现次数最多的4个汉字的
二进制编码。
请问地球接收到的回复信息经汉字编码后是什么?
*/
#include<bits/stdc++.h>
using namespace std;
//一个汉字占两个char!!!!!!!
char s1[1000]="向收到该信息的世界致以美好的祝愿。通过以下信息。你\
们将对地球文明有了一个基本的了解。人类经过漫长的劳动和创造,建立了灿烂的\
文明,涌现出丰富多彩的文化,并初步了解了自然界和人类社会运行发展的规律,\
我们珍视这一切。但我们的世界仍有很大缺陷,存在着仇恨、偏见和战争,由于生\
产力和生产关系的矛盾,财富的分布严重不均,相当部分的人类成员生活在贫困和\
苦难之中。人类社会正在努力解决自己面临的各种困难和问题,努力为地球文明创\
造一个美好的未来。发送该信息的国家所从事的奉业就是这种努力的一部分。我们\
致力于建立一个理想的社会,使每个人类成员的劳动和价值都得到充分的尊重,使\
所有人的物质和精神需要都得到充分的满足,使地球文明成为一个更加完美的文明。\
我们怀着美好的愿望,期待着与宇宙中其他文明社会建立联系。期待着与你们一起,\
在广阔的宇宙中创造更加美好的生活。";//读入原文
int max(int *a)
{
int max=a[0];
int temp=0;
for(int i=0;i<=1000;i=i+2){
if(a[i]>max)//不考虑数量相同的情况
{
max=a[i];
temp=i;//用temp记最大数的下标
}
}
a[temp]=0;//置零,进行取下面第二大的数
return temp;
}
int main()
{
int a[1000];memset(a,0,sizeof(a));
for(int i=0;i<strlen(s1);i=i+2){//拿出一个来遍历对比原文 //问题有无等号。。。
if((s1[i]==-95&&s1[i+1]==-93)||(s1[i]==-93&&s1[i+1]==-84)||(s1[i]==-95&&s1[i+1]==-94))//遇到标点的操作,跳过
{
continue;
}
for(int j=i+2;j<strlen(s1);j=j+2){//全文过一遍 //问题有无等号 ...
//if((s1[i]==0X30&&s1[i+1]==0x02)||(s1[i]==0XFF&&s1[i+1]==0x1F)||(s1[i]==0XFF&&s1[i+1]==0x01)||(s1[i]==0XFF&&s1[i+1]==0x0C)||(s1[i]==0XFF&&s1[i+1]==0x1B)||(s1[i]==0XFF&&s1[i+1]==0x1A)) continue;//if(s1[i]=='。'||s1[i]==','||s1[i]=='、'||s1[i]=='A'||s1[i]==' ') continue;
if(s1[i]==s1[j]&&s1[i+1]==s1[j+1]) {//用遍历的比对原文,原文的变成A
s1[j]=-95;//如果相等,原文的变成A //问题所在:这样我只是把第一个字节的,变成了A,就变成了其他的字,s1[j]='A';
s1[j+1]=-93; //变成中文井号吧,中文句号的ASCII码0XFF23
a[i]++;//记录下标,记住i ,方便以后遍历
}
}
}
//printf("%c %c %c %c",s1[max(a)],s1[max(a)],s1[max(a)],s1[max(a)]) ;
/*for(int i=0;i<=strlen(s1);i=i+2)
{
printf("%c%c",s1[i],s1[i+1]);
}*/
printf("%s",s1);//问题全变成空格了,信息也被覆盖了。。。
int t1,t2,t3,t4;
t1=max(a);t2=max(a);t3=max(a);t4=max(a);
printf("\n%c%c %c%c %c%c %c%c",s1[t1],s1[t1+1],s1[t2],s1[t2+1],s1[t3],s1[t3+1],s1[t4],s1[t4+1]) ;
return 0;
}/*
井号 FF23
句号 3002 。 -95 -93
问号 FF1F ?
叹号 FF01 !
逗号 FF0C , -93 -84
顿号 3001 、 -95-94
分号 FF1B ;
冒号 FF1A :
/*
#include <stdio.h>
//读一个字符
int main(int argc,char *argv[])
{
FILE *p = fopen("/Users/Devin/Desktop/a.txt", "r");
if (p == NULL)
{
printf("文件打开失败\n");
}
else
{
char c = 0;
while( (c = getc(p)) != EOF)//EOF代表文件最后的一个结束标示
{
printf("%c", c);
}
//使用完,关闭文件
fclose(p);
}
return 0;
}
*/

浙公网安备 33010602011771号