经过努力,由原来的一步步算,到26为一步算,再到现在的层层累加算,终于可以秒出,改进真难呀,改得代码都变长了。
·
·
[ 本帖最后由 UserYuH 于 2009-11-1 21:19 编辑 ]
·
·
程序代码:
#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; while(*p) /* 如有大写转成小写 */ if(*p++<97) *(p-1)+=32; p=a; for(;*(p+1);p++) if(*p>=*(p+1)) return 1; return 0; } void chushi(char *b,int len) /* 取字符最大长度的有序值 */ { long n=0,j,jishu=26,js,ji[27]; int i,k,m=26; sum=jishu+1; for(i=0;i<27;i++) ji[i]=1; for(i=2;i<len;i++) { for(n=k=0,j=jishu;k<m;k++,j-=js) {js=ji[k],ji[k]=j-js,n+=ji[k];} jishu=n; sum+=n; m--; } if(a[0]>b[0]) { for(n=k=0,j=jishu;k<a[0]-(b[0]+1);k++,j-=js) {js=ji[k],ji[k]=j-js,n+=ji[k];} sum+=n; } for(i=0;i<len;i++) b[i]+=i+(a[0]-('a'-1)); } void funsuan(int n) /* 递归算零头 */ { if((strcmp(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]='a'-1; b[i]=0; if(len>1)chushi(b,len); while(1) {if(strcmp(a,b)!=0) funsuan(len-1); else break; } printf("%s=%ld\n\n",b,sum); getch(); return 0; }
[ 本帖最后由 UserYuH 于 2009-11-1 21:19 编辑 ]
努力—前进—变老—退休—入土