| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1846 人关注过本帖
标题:[求助]看似简单的非简单题,求编程思想
只看楼主 加入收藏
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
收藏
得分:0 
后面的要比前面的大.最后的应该是abcdefghijklmnopqrsyuvwxyz

倚天照海花无数,流水高山心自知。
2006-06-22 23:30
神vLinux飘飘
Rank: 13Rank: 13Rank: 13Rank: 13
来 自:浙江杭州
等 级:贵宾
威 望:91
帖 子:6140
专家分:217
注 册:2004-7-17
收藏
得分:0 
你说5楼理解错了。。。我是在不明白5楼到底什么错了。。

淘宝杜琨
2006-06-22 23:33
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 
以下是引用nuciewth在2006-6-21 23:40:11的发言:
对英文字母进行编码,编码方式如下:a b c .......z ab ac ....az bc bd ....bz......xy xz yz abc abd...abz.....
对应从1开始赋值,即1 2 3...26 27 28......
求解:键盘输入一行字符串,如果输入的字符串非法(例如:acb),输出非法的提示0,否则输出该字符串的编码(例如:输入ab,输出27).下面给出几组测试数据:
输入:
z
a
cat
vwxyz
输出:
26
1
0
83681

剖题
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位数集中的第几个
其“价值”就算出来了。


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-23 10:44
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

/*准备工作:组合数C(26,n)的产生*/
#include<stdio.h>
#define N 26
main()
{
int i,j;
long C26[N+1]={1};

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<N;i++)
printf("%ld,",C26[i]);
printf("%ld\n",C26[i]);
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-24 18:24
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

/*下面先解决楼主举例"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的合法串
怎样适应不同长度的串呢?看来只能用递归解决问题!!!*/


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-25 16:13
limaoyuan0921
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-6-25
收藏
得分:0 
强!!!!!!!!!!我一看这么多就烦了...

做C的题是考想法吗?

就算考试也要把明确的规则给说出来的..

没有规则...看着就晕...
2006-06-25 17:29
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

/*
楼主问题完全解决方案
蓝色代码写得不够理想
*/
#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);
}
}


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-25 19:17
上杉冰枫
Rank: 1
等 级:新手上路
帖 子:108
专家分:0
注 册:2006-6-24
收藏
得分:0 
本来只看题目还看的有点明白
可是我怎么感觉你们一分析我反而糊涂了啊
我晕了

因为→№頦§縎£銘→訫‰ 所以→№從此々吥£唁→愛‰
2006-06-25 19:52
–★–
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1512
专家分:0
注 册:2006-5-1
收藏
得分:0 

/*楼主问题完全解决方案*/
#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编辑过]


落霞与孤鹜齐飞,秋水共长天一色! 心有多大,路有多宽。三教九流,鸡鸣狗盗。兼收并蓄,海纳百川。
2006-06-25 22:05
钱的马甲
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2006-6-21
收藏
得分:0 
我是金为床兮银为椅,这道题目我作了整整两天,没做出来,惭愧。我不能再做了,还有别的工作,也许基本功练好了就可以迎刃而解了。

本人告别这个论坛,这道题目记下了,等以后解决了,我再注册个ID发出来。想问我基础问题的,到CSDN去找我,ID是asusa3a,昵称是金为床兮银为椅。
2006-06-26 08:31
快速回复:[求助]看似简单的非简单题,求编程思想
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017143 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved