经过努力,由原来的一步步算,到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 编辑 ]

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









1