如果用数字1——26代表英文字母a--z,即1--a,2--b,以此类推……26——z;
那么我们可以用数字来代表相应的单词。
但是一个数字排列有多种可能,
如123可能代表abc(1,2,3.),也可能代表lc(12,3),或者aw(1,23)
要求编一个程序,计算出从键盘输入的每串数字可能代表的字母串的个数,输入0则程序结束
如
input:
25114
1111111111
3333333333
0
output:
6
89
1
==============================================================================
1只有一种排法.
1:
1
12:
(1)+2 (这里面的1是只有一个1的时候)
因为12可组有.
(12)....................共二个.
121:
(1+2)+1 (这是只有12的时候的情况)
(12)+1 (这是只有12的时候的情况)
此时因为2与1可组.顾多出单独1的时候的情况.
(1)+21 (这里是1单独的时候的情况)...........共三.
1212:
(1+2+1)+2 (这是只有121的时候的情况)
(12+1)+2 (这是只有121的时候的情况)
(1+21)+2 (这是只有121的时候的情况)
此时因为1与2可组.顾多出单独12时候的情况.
(1+2)+12 (这是只有12的时候的情况)
(12)+12 (这是只有12的时候的情况)..........共五.
----------------------------------------
至此.后面递推.应是斐波那契数列........
================================================
再回到总体.假设有一个为:12312612
明眼人一看便知这个数列的总结果应为(123)(126)(12)三个单项的积....
原因很简单.
123的3与12的1没法组成有效数.被隔离了.而126与12同理被隔离了.
也就是三者个数取斐波那契之后相乖即可...........
===========================================================================
#include<iostream>
using namespace std;
int f(int n)
{
if(n==1)return 1;
if(n==2)return 2;
return f(n-1)+f(n-2);
}
int make(char *str)
{
int count=1;
int len=strlen(str);
int i,j;
for(i=0,j=1;i<len;i++,j++)
{
if((str[i]==49||str[i]==50))
{
if(i+1==len)count*=f(j);
continue;
}
if(i-1>-1&&str[i]>54&&str[i-1]==50)j--;
count*=f(j);
j=0;
}
return count;
}
int main()
{
char *str[200];
int i;
for(i=0;i<200;i++)str[i]=new char[200];
i=0;
cin>>str[i];
while(strcmp(str[i],"0"))cin>>str[++i];
i=0;
while(strcmp(str[i],"0"))cout<<make(str[i++])<<endl;
for(i=0;i<200;i++)delete str[i];
system("PAUSE");
return 0;
}