真帅,问题解决,TC下递归多次会自动退出,放个循环来控制调用递归就解决了。
最终代码:
[ 本帖最后由 UserYuH 于 2009-10-31 18:13 编辑 ]
最终代码:
程序代码:
#include <stdio.h> #include <string.h> int len,flag=0; long sum=0,m; char a[27],b[27]; int panduan(char *a) /* 判断字符串是否为升序 */ { char *p=a; for(;*(p+1);p++) if(*p>=*(p+1)) return 1; p=a; while(*p) /* 如有大写转成小写 */ if(*p++<97) *(p-1)+=32; return 0; } int zifucmp(char *a,char *b) /* 比较两字符 */ { int i=len-1; for(;i>=0;i--) if(a[i]!=b[i]) return 1; return 0; } void funsuan(int n) /* 递归算法 */ { if((zifucmp(a,b))==0) return; if(n+1==len) { if(m==1000) {m=0;return;} if(len!=1) { if(a[n-1]!=b[n-1] || !flag) { flag=1; sum+='z'+1-b[n]; b[n]+='z'+1-b[n]; } else if(flag) { flag=0; sum+=a[n]-b[n]; b[n]+=a[n]-b[n]; } } else { sum+=a[0]-b[n]; b[n]+=a[0]-b[n]; } m++; if(b[n]>'z') { funsuan(n-1); b[n]=b[n-1]+1; funsuan(n); } else funsuan(n); } else { b[n]++; if(b[n]>=b[n+1]-1) { funsuan(n-1); b[n]=b[n-1]+1; } } } int main(void) { int i; while(1) { gets(a); if(panduan(a)) printf("input error!\n"); else break; } len=strlen(a); for(i=0;i<len;i++) b[i]=96; b[i]=0; while(1) if(zifucmp(a,b)!=0) funsuan(len-1); else break; printf("%s=%ld\n\n",b,sum); getch(); return 0; }更改:最坏情况输入最大abcdefghijklmnopqrstuvwxyz,原来是19秒左右出结果,现在6秒内出结果,唉,真得是慢慢改进。
[ 本帖最后由 UserYuH 于 2009-10-31 18:13 编辑 ]
努力—前进—变老—退休—入土