找回密码
 欢迎注册
楼主: chyanog

[求助] 写一个函数,输入0打印A,1打印B,...,26打印AA,27打印AB........

[复制链接]
发表于 2011-12-8 16:50:07 | 显示全部楼层
有点长:
  1. f = FromCharacterCode[ PadLeft[IntegerDigits[# - (26 (26^Floor[Log[26, 25 #/26 + 1]] - 1))/25, 26], Floor[Log[26, 25 #/26 + 1]] + 1] + 65] &
复制代码
反函数:
  1. g = FromDigits[ToCharacterCode[#] - 65, 26] + ( 26 (26^(StringLength[#] - 1) - 1))/25 &
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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"}
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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;
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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)}]$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 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= ([1000/26]-1) mod 26 = 11 $
$ d_3= ([([1000/26]-1)/26]-1) mod 26 =0 $
$ 1000=ALM $
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-5-18 13:29 , Processed in 0.045501 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表