整体思路:建立一个一维数组arr[len],用来记录每一个位置当前有多少种译码结果。
主要判断有0的情况:1.连续俩个零代表译码有误,输出零
2.如果第一个位置就是'0',输出零
3.当前位置为'0',前一个位置不是'1'或'0',输出零
否则,arr[0]记录为1,若果第二个位置是符合上面输出零的情况,arr[1]记录为1,否则记录为2,接下来开始循环判断,只要前一位置的值与当前的值小于26,说明就有俩种译码方式,一种是俩个字符各一个,一种是直接俩位数译码,那么当前的译码方式就有arr[i-1]+arr[i-2]。
最后,需要判断字符串中有'0'的情况:1.如果当前为零,则当前位置的译码方式就是arr[i-2],应为arr[i-1]
要与'0'组合,所以要在往前一个位置
2.如果前一位置为零,则当前位置的译码方式为arr[i-1];

#include <stdio.h>
#include <string.h>

int main()
{
    char s[1000];
    while(scanf("%s",s)!=EOF)
    {
        if(s[0]=='0')
        {
            printf("%d\n",0);
            continue;
        }
        int len=strlen(s);
        int arr[len];
        arr[0]=1;
        if(((s[0]-48)*10+s[1]-48)>26)
            arr[1]=1;
        else
        {
            if(s[1]=='0')
                arr[1]=1;
            else
                arr[1]=2;
        }
        int i;
        for(i=2;i<len;i++)
        {
            if(s[i]=='0' && !('0'<s[i-1] && s[i-1]<'3'))
                break;
            if(s[i]=='0')
            {
                arr[i]=arr[i-2];
                continue;
            }
            if(s[i-1]=='0')
            {
                arr[i]=arr[i-1];
                continue;
            }
            if(((s[i-1]-48)*10+s[i]-48)>26)
                arr[i]=arr[i-1];
            else
                arr[i]=arr[i-1]+arr[i-2];
        }
        if(i==len || len==1)
            printf("%d\n",arr[len-1]);
        else
            printf("%d\n",0);
    }
    return 0;
}