字母——数字密码

如果用数字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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值