程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 編碼問題 題解,編碼題解

編碼問題 題解,編碼題解

編輯:Delphi

編碼問題 題解,編碼題解


【問題描述】

編碼工作常被運用於密文或壓縮傳輸。這裡我們用一種最簡單的編碼方式進行編碼:把一些有規律的單詞編成數字。字母表中共有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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved