4104 Soundex编码

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; 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值