编码问题 题解

【问题描述】

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

【样例输入】

  ab

【样例输出】

  27

【解题思路】

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

【代码实现】

编码
var s:string;
    ans,i,l:longint;
    flag:boolean;
function c(x,y:longint):longint;
var t,i:longint;
begin
 c:=1;
 for i:=1 to y do
  c:=c*(x-i+1)div i;
end;
procedure dfs(n:longint;st:string);
var j:longint;
    i,ch:char;
begin
 if n=l then
  begin
   inc(ans);
   if st=s then
    begin
     flag:=true;
     exit;
    end;
  end;
 if n=0 then
  ch:='a'
 else
  ch:=succ(st[n]);
 for i:=ch to 'z' do
  begin
   dfs(n+1,st+i);
   if flag then exit;
  end;
end;
begin
 readln(s);
 l:=length(s);
 for i:=1 to l-1 do
  ans:=ans+c(26,i);
 dfs(0,'');
 writeln(ans);
end.

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

【参考文献】

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

posted @ 2015-05-06 10:06  PbTfcLx  阅读(852)  评论(0编辑  收藏  举报