zoukankan      html  css  js  c++  java
  • 编码问题 题解

    【问题描述】

    编码工作常被运用于密文或压缩传输。这里我们用一种最简单的编码方式进行编码:把一些有规律的单词编成数字。字母表中共有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

  • 相关阅读:
    ASP日期格式化函数
    HTML友情链接代码
    JS判断是否为数字或为空
    ASP查询数据RS转换成COMMAND
    PHP文本的读写
    负边距的应用
    EntityFramework数据持久化 Linq介绍
    EntityFramework数据持久化 Linq介绍
    EntityFramework数据持久化 Linq介绍
    EntityFramework数据持久化 Linq语法应用
  • 原文地址:https://www.cnblogs.com/PengBoLiuXu/p/4481089.html
Copyright © 2011-2022 走看看