倚天照海花无数,流水高山心自知。
剖题:
1。与多数计数系统一样,楼(主的记数)系(统)认定
最大的k-1位数恰好比最小的k位数小1。
2。楼系的1位数共计有26个,即组合数C261个
楼系的2位数共有26×25÷2个即C262个
楼系的3位数共有26×25×24÷2÷3个即C263个
。。。。。。。。。。。。。。。。。。。
楼系的k-1位数共计有组合数C26k-1个
3。因此楼系的任何k位数都有如下“基值”:
k-1
base = ∑C26n
n=1
4。至此只要弄清某k位数是整个k位数集中的第几个
其“价值”就算出来了。
/*下面先解决楼主举例"vwxyz"*/
#include<stdio.h>
#include<string.h>
#define N 26
long base(long C26[],int len)
{
int i,j;
long base=0;
for(i=1;i<=N;i++)
for(j=i;j>=1;j--)
C26[j]+=C26[j-1];//C26[n]==C(26,n)
for(i=1;i<len;i++)base+=C26[i];
return base;
}
main()
{
char s[]="abcde";
long C26[N+1]={1},value;
value=base(C26,strlen("vwxyz"));
for(s[0]= 'a' ;s[0]<='z';s[0]++)
for(s[1]=s[0]+1;s[1]<='z';s[1]++)
for(s[2]=s[1]+1;s[2]<='z';s[2]++)
for(s[3]=s[2]+1;s[3]<='z';s[3]++)
for(s[4]=s[3]+1;s[4]<='z';s[4]++)
if(strcmp("vwxyz",s)==0)goto out;
else value++;
out:
printf("%ld\n",++value);
}
/*显然这是无通用性的笨办法——只能针对长度为5的合法串
怎样适应不同长度的串呢?看来只能用递归解决问题!!!*/
/*
楼主问题完全解决方案
蓝色代码写得不够理想
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define N 26
long base(long C26[],int len)
{
int i,j;
long base=0;
for(i=1;i<=N;i++)
for(j=i;j>=1;j--)
C26[j]+=C26[j-1];/*C26[n]==C(26,n)*/
for(i=0;i<len;i++)base+=C26[i];
return base;
}
int ok(char *p)
{
char ch=*p++;
if(ch<'a')return 0;
while(*p!='\0')
{
if(ch>=*p)return 0;
ch=*p++;
}
return 1;
}
char s[80];
char t[80];
long value;
void func(int i,char c)
{
static long val;
if(s[i])
{
for(s[i]=c;s[i]<='z';s[i]++)
func(i+1,(char)(s[i]+1));
}
else if(strcmp(t,s))
{
val++;
}
else
{
value=val;
}
}
main()
{
int i,len;
long C26[N+1]={1};
puts("please input an English string:");
gets(t);
if(!ok(t))
{
printf("0\n");
}
else
{
len=strlen(t);
for(i=0;i<len;i++)
s[i]=' ';
s[i]='\0';
func(0,'a');
value+=base(C26,len);
printf("%ld\n",value);
}
}
/*楼主问题完全解决方案*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
long base(int len)
{ /*C26[n]==C(26,n)*/
long C26[27]={1};
int i,j;long base=0;
for(i=1;i<=26;i++)
for(j=i;j>=1;j--)
C26[j]+=C26[j-1];
for(i=0;i<len;i++)
base+=C26[i];
return base;
}
int isOK(char*p)
{
char ch=*p++;
if(ch<'a')return 0;
while(*p!='\0')
{
if(ch>=*p)return 0;
ch=*p++;
}
return 1;
}
char str[80];
long func(int i,char c)
{
static char *s;
static long val;
static init,suc;
if(!init)
{
init=1;suc=0;val=0;
s=(char*)malloc(1+strlen(str));
strcpy(s,str);
}
if(s[i])
{
for(s[i]=c;s[i]<='z'&&!suc;s[i]++)
func(i+1,(char)(s[i]+1));
}
else if(strcmp(s,str))
val++;
else
suc=1,free(s);
return suc?(init=0,val):0;
}
main()
{
while(1)
{
long value=0;
puts("input an English string:");
gets(str);strlwr(str);/*小写化*/
if(isOK(str))
value=base(strlen(str))+func(0,'a');
printf("%ld\n",value);
}
}
[此贴子已经被作者于2006-6-26 5:58:54编辑过]