1、这道题是我做的第一道二分法题目,二分法的时间效率确实高,要好好学一学。
#include<cstdio>
#include<cstring>
using namespace std;
char s[10010];
int len;
long long f(int left,int right){
if(left>right) return 1;
else if(left==right){
if(s[left]=='0') return 0;
else return 1;
}
else{
int mid=(left+right)/2;
int num=(s[mid]-'0')*10+s[mid+1]-'0';
if(num>=10&&num<=26) return f(left,mid)*f(mid+1,right)+f(left,mid-1)*f(mid+2,right);
else return f(left,mid)*f(mid+1,right);
}
}
int main(){
while(scanf("%s",s)==1){
if(s[0]=='0') break;
len=strlen(s);
printf("%I64d\n",f(0,len-1));
}
return 0;
}