码迷,mamicode.com
首页 > 其他好文 > 详细

编码问题 题解

时间:2015-05-06 10:41:08      阅读:134      评论:0      收藏:0      [点我收藏+]

标签:

【问题描述】

编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。字母表中共有26个小写字母{a,b,c….,z}。这些特殊的单词长度不超过6且字母按照升序排列。把所有这样的单词放在一起,按字典顺序排列,一个单词的编码就对应着它在字典中的位置,例如:a-1;b-2;z-26;ab-27;ac-28;你的任务就是对于所给的单词,求出它的编码。

【解题思路】

设给定的字母长度为l,不难看出可以用组合数公式求出长度为l的第一个单词的编码,即Σ(C(26,i),1<=i<=l-1)+1,接着用搜索一个个去搜长度为l的编码,直到输入的单词为止。

【代码实现】

技术分享
 1 var s:string;
 2     ans,i,l:longint;
 3     flag:boolean;
 4 function c(x,y:longint):longint;
 5 var t,i:longint;
 6 begin
 7  t:=1;
 8  for i:=1 to y do
 9   t:=t*(x-i+1)div i;
10 end;
11 procedure dfs(n:longint;st:string);
12 var j:longint;
13     i,ch:char;
14 begin
15  if n=l then
16   begin
17    inc(ans);
18    if st=s then
19     begin
20      flag:=true;
21      exit;
22     end;
23   end;
24  if n=0 then
25   ch:=a
26  else
27   ch:=succ(st[n]);
28  for i:=ch to z do
29   begin
30    dfs(n+1,st+i);
31    if flag then exit;
32   end;
33 end;
34 begin
35  readln(s);
36  for i:=1 to length(s)-1 do
37   ans:=ans+c(26,i);
38  dfs(0,‘‘);
39  writeln(ans);
40 end.
Code

请注意求组合数公式的方法!普通组合数公式会超范围,因此,这里用了自定义C函数,不理解的可以手推一下。(本人推了好久终于在老师的帮助下弄懂了……)。

【参考文献】

http://www.cnblogs.com/whitecloth/articles/2400584.html

编码问题 题解

标签:

原文地址:http://www.cnblogs.com/PengBoLiuXu/p/4481089.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!