这道题的题意大概是这样的:给出一个字符串,如果将字母表中的26个字母依次映射成数字1-26,这样便形成一个密码。学过密码学就知道,这是一个简单的替代密码不过似乎并不是那么好用,虽然加密的确很方便,可是解密就麻烦了,因为存在很多种解密的方法,所以本题就是要你求出一串数字究竟有多少种解密方法。
代码如下:
#include<iostream>
using namespace std;
const int mMax=10000;
int main()
{
char m[mMax];
__int64 sin[mMax],dou[mMax]; // sin[]存尾数为1位的情况,dou[]存尾数为2位的情况。
int i,len;
while(cin>>m+1 && m[1]!='0')
{
sin[1]=1;
dou[1]=0;
len=strlen(m+1); //必须为m+1
for(i=2;i<=len;i++)
{
if(m[i]=='0')
{
sin[i]=0;
dou[i]=sin[i-1];
}
else // 最后为零,则尾数为1位=0,尾数为2位=上一个尾数为1位
if(m[i-1]=='1' || m[i-1]=='2' && m[i]<='6') //最后两位可以凑
{
sin[i]=sin[i-1]+dou[i-1];
dou[i]=sin[i-1];
}
else //最后两位不可凑
{
sin[i]=sin[i-1]+dou[i-1];
dou[i]=0;
}
}
printf("%I64d\n",sin[len]+dou[len]);
}
return 0;
}