编码简介:
在数据加密和数据压缩中长需要对特殊的字符串进行编码。给定的字母表由26个小写英文字母组成,即A={a,b,c,...,z}。该字母表产生的升序字符串是指字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字母最多出现1次。例如,a、b、ab、bc、xyz等字符串都是升序字符串。现在对字母表A产生的所有长度不超过6的升序字符串按照字典序排列并编码。
编程要求:
对于任意长度不超过6的升序字符串,迅速计算出它在字典中的编码。
算法设计:对于给定的长度不超过6的升序字符串,计算它在上述字典中编码。
数据输入说明:第一行输入数据n,表示接下来有n行;在接下来的n行中,每行给出一个字符串。
比如,测试输入:
2
a
b
预期的输出:
1
2
分析:
仔细观察要求,其实可以把编码方式分成两部分来看。第一部分是编码的最后一位,比如"abe"的"e",由字符串编码减去'a'(ASCLL码)就是"e"的序号。第二部分则是前面的所有字符,比如"abe"的"ab",这部分由字符数乘以26再加上前面第一部分的编码就是最终的字典序编号了。
注意的是,输入的字符串用二位数组存储,每行存一个字符串,这样方便我们找到字符串的最后一位!
代码:
#include <stdio.h>
int main(){
int n;//n表示接下来要输入n行的字符串
scanf("%d",&n);
char Arr[n][6];//这个字符数组每行存储一个输入的字符编码
for(int i=0;i<n;i++){
scanf("%s",Arr[i]);
int count=0;//统计输入的字符串有几个
for(int j=0;Arr[i][j]!='\0';j++){
count++;
}
if(count==1){
printf("%d\n",Arr[i][count-1]-'a'+1);//c=1说明只有一个字符,比如d,编码为4,d减去a的ASCLL码+1即可
}
else{
printf("%d\n",Arr[i][count-1]-'a'+26*(count-1));//c!=1说明不止一位编码,因为排序是升序的,因此只需要考虑字符串的最后一位,操作同上
} //前面的将位数减一乘以26位字母数再加上最后一位的编码数就是最终编码
}
return 0;
}