题目:现有一个数字字符串(全部由数字0--9组成),按照以下规则转化为由字母组成的字符串:
1---->a , 2----->b,3------>c, ... ... ,25---->y , 26------>z 。如输入数字字符串“13201”,则输出的结果为:“acta”或"mta".设计一个程序,完成该转化功能,根据输入进来的数字字符串,输出其所有可能的字母字符串。(如不能转化,则输出“Can Not!”)
分析:根据转化规律,不难发现‘0’没有对应的字母,因此,‘0’必须依靠其前一位数字才能转化,而且,其前一位数字字符只能是‘1’和‘2’,不能为其他的数字字符。而‘1’可以与其后一位的任何数字字符组合并转化,但是,‘2’则只能与其后一位、范围在‘0’--’6‘的字符组合转化。需要注意的是,这些组合,不能导致其他后续‘0’(如果存在的话)的“孤立”(即不能借助1,2转化)。
#include <iostream>
using namespace std;
bool CanOrNot(char str[],int n)
{
if(str==NULL||n<1||str[0]=='0')
return false;
for(int i=1;i<n;++i)
{
if(str[i]=='0')
if(str[i-1]=='1'||str[i-1]=='2')
NULL;
else
return false;
}
return true;
}
//函数处理后,str指向的字符串不含0(已被处理了)
void trasform(char str[],int n)
{
if(false==CanOrNot(str,n))
{
cout<<"Can Not!"<<endl;
return ;
}
char *str_2 = (char *)malloc(n);
memset(str_2,0,n);
str_2 = str;
char *p = str,*q = str+1;
//处理‘0’的问题,将0直接与前面的数字(1,2)替换成对应字母
while(*p!='\0')
{
if(*q=='0')
{
if(*p=='1')//"10"
{
*str_2 = 'j';
++str_2;
p = p + 2;
q = q + 2;
}
else //"20"
{
*str_2 = 't';
++str_2;
p = p + 2;
q = q + 2;
}
}
else//非0
{
*str_2 = *p;
++str_2;
++p;
++q;
}
}
}
//实现转换的函数,时间关系,略,下次补上
void fun(char str[])
{
}
int _tmain(int argc, _TCHAR* argv[])
{
char a[] = "1208514291302";//not
char b[] = "1213105411214978";//yes
trasform(b,strlen(a));
fun(b);
cin.get();
return 0;
}
【未完,待续】