Soundex编码是根据单词的拼写和发音相似性来对单词进行分组,例如,“can”与“khawn”, “con”与“gone”在Soundex编码下是相同的。
Soundex编码方法将每个单词转换成一串数字,每个数字代表一个字母。具体如下:
1 表示B、F、P或V;
2 表示C、G、J、K、Q、S、X或Z;
3 表示D或T;
4 表示L;
5 表示M或N;
6 表示R。
字母A,E,I,0,U,H,W和Y在Soundex中不用编码的,可以直接忽略。相邻的并且具有相同编码值的字母只用一个对应的数字表示。具有相同Soundex编码值的单词被认为是相同的单词。
输入格式:
输入文件中的每行为一个单词,全部大写,不超过20个字母。
输出格式:
对输入文件中的每个单词,输出该单词的Soundex编码,占一行。
输入样例:
KHAWN
PFISTER
BOBBY
输出样例:
25
1236
11
代码:这道题上课的时候没做出来,所以这个我不知道能不能过pta,但是输出输入与样例相同
转化简单,选择判断即可。
主要是输出时如果连续的两个字母都转换为相同的数字时只输出1个数字,就像输入样例中的PFISTER转化后是11236,前两位连续字母均转换为1,只输出一个1,即输出1236;又如输入样例中的BOBBY,转换后为111,但是第一个1与第二个1之间有一个字母不转换,就相当于不是连续两个字母均转换为1,但是后面的连续的两个B都转换为1,只输出一个1,所以输出为11
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char str[20];
int i;
while(scanf("%s",str)!=EOF){
int a[20]={0};//存放每个字母的转换值,不在转换规则里的赋值为0
for(i=0;i<strlen(str);i++){
if(str[i]!='A'&&str[i]!='E'&&str[i]!='I'&&str[i]!='O'&&str[i]!='U'&&str[i]!='H'&&str[i]!='W'&&str[i]!='Y'){
if(str[i]=='B'||str[i]=='F'||str[i]=='P'||str[i]=='V') a[i]=1;
if(str[i]=='C'||str[i]=='G'||str[i]=='J'||str[i]=='K'||str[i]=='Q'||str[i]=='S'||str[i]=='X'||str[i]=='Z') a[i]=2;
if(str[i]=='D'||str[i]=='T') a[i]=3;
if(str[i]=='L') a[i]=4;
if(str[i]=='M'||str[i]=='N') a[i]=5;
if(str[i]=='R') a[i]=6;
}
}
for(i=0;i<strlen(str);i++){
if(a[i]!=0&&a[i]!=a[i+1]){//当两个连续的字母转换为相同数字时只输出一个数字
printf("%d",a[i]);
}
if(i==strlen(str)-1) printf("\n");
}
}
return 0;
}