wayne 发表于 2011-12-8 16:50:07

有点长:f = FromCharacterCode[ PadLeft] - 1))/25, 26], Floor] + 1] + 65] &反函数:g = FromDigits - 65, 26] + ( 26 (26^(StringLength[#] - 1) - 1))/25 &

wayne 发表于 2011-12-8 17:00:43

14# 风云剑
正确!
{10, "K"}
{100, "CW"}
{1000, "ALM"}
{10000, "NTQ"}
{100000, "EQXE"}
{1000000, "BDWGO"}
{10000000, "UVXWK"}
{100000000, "HJUNYW"}
{1000000000, "CFDGSXM"}
{10000000000, "AFIPYQJQ"}
{100000000000, "LKRMVRBE"}
{1000000000000, "DTMCHRXUO"}
{10000000000000, "AUWAGIGNGK"}
{100000000000000, "RJVLUNWLUW"}
{1000000000000000, "GBDPXGRZXJM"}
{10000000000000000, "BRUTMHYHIIZQ"}
{100000000000000000, "AAFIWCKSEOVFE"}
{1000000000000000000, "JLKTWHMJDBNIO"}
{10000000000000000000, "CZTMZYGCWNYMQK"}
{100000000000000000000, "ANGWJIRSMASUFQW"}

xbtianlang 发表于 2011-12-8 17:12:21

const s: String = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
function AZ(const N: Integer): string;
var i: Integer;
begin
    Result:='';
    i:=N+1;
    while i>0 do
    begin
      Result:=s[(i-1) mod 26+1]+Result;
      i:=(i-1) div 26;
    end;
end;

mathe 发表于 2011-12-8 18:29:25

一个字母的有26个,两个字母的$26^2$个,...
所以字母总数不超过k个的情况共$26+26^2+...+26^k={26^{k+1}-1}/25-1={26^{k+1}}/25-1/25-1=[{26^{k+1}}/25-1]$
于是对于任意一个数x,如果要找对应的位数,那么就相当于找k是的
${26^k}/25-1<x+1<{26^{k+1}}/25-1$
或者说
$26^k<25(x+2)<26^{k+1}$
$k<{ln(25(x+2))}/{ln(26)}<k+1$
$k=[{ln(25(x+2))}/{ln(26)}]$

mathe 发表于 2011-12-8 18:37:13

比如取x=1000,马上算出对应k=3,由于前面两位数数目是[{26^3}/25-1]=702
然后计算1000-702=298,将298转化为3位26进制数得出(0,11,12),于是结果是ALM

xbtianlang 发表于 2011-12-8 20:21:51

我的算法是直接递推,当除以26的商=0时结束:
$ 1000=((d_3+1)*26+(d_2+1))*26+d_1 $
$ d_1=1000 mod 26 = 12 $
$ d_2= (-1) mod 26 = 11 $
$ d_3= ([(-1)/26]-1) mod 26 =0 $
$ 1000=ALM $
页: 1 2 [3]
查看完整版本: 写一个函数,输入0打印A,1打印B,...,26打印AA,27打印AB........