真帅,问题解决,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 编辑 ]

努力—前进—变老—退休—入土






