`
thoreau
  • 浏览: 356495 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

26字母与十进制转换

 
阅读更多

转自:https://blog.csdn.net/liujinsuoabc/article/details/18354275

 

最近在封装Excel组件,需要提供两个接口,分别根据单元索引和单元名称访问单元格。例如,GetCell(1, 2)和GetCell(“A2”),这两种方法返回的结果是相同的。这里遇到一个问题,如何在单元索引([1,2])和单元名称(A2)之间相互转换?
由于在单元索引和单元名称中,行号是相同的,所以我们只需要转换列号就可以了。本来以为是个很简单的问题,结果调试了好长时间才搞定。于是写了这篇文章,总结一下。

 

【问题描述】

在Excel中,列的名称是这样一个递增序列:A、B、C、…、Z、AA、AB、AC、…、AZ、BA、BB、BC、…、BZ、CA、…、ZZ、AAA、AAB…。
我们需要将上述列名序列和以下自然数序列相互转换:1、2、3、…。

 

【问题分析】

经过分析,我们不难发现,这是一个26进制和十进制相互转换的问题。序列A-Z依次对应序列1-26。进制转换的基本办法就是“取余法”,换算规则如下:
ABZ = 1*26² + 2 * 26¹ + 26*26°= 676 + 52 + 26 = 754
于是,我们就知道该如何设计一个十进制转换为26进制的算法了。

 

【算法描述】
Step1.[取余] 用指定自然数n除以26,得到一个余数m。如果m = 0,置m←26。
Step2.[转换为字符] 将m映射为字符c,映射规则是{1-26}->{A-Z}。然后将c拼接到26进制值s的左边,也就是置s←c + s。
Step3.[去余降幂] 置n←(n–m)/26。如果n > 0,则回到Step1继续执行,否则进入Step4。
Step4.[结束] 返回s。

按照上述思想,26进制转换为十进制的过程正好是相反的,而且实现起来也更为简单,在此不述。

 

 

  1.  
    /// <summary>
  2.  
    /// 将指定的自然数转换为26进制表示。映射关系:[1-26] ->[A-Z]。
  3.  
    /// </summary>
  4.  
    /// <param name="n">自然数(如果无效,则返回空字符串)。</param>
  5.  
    /// <returns>26进制表示。</returns>
  6.  
    public static string ToNumberSystem26(int n){
  7.  
    string s = string.Empty;
  8.  
    while (n > 0){
  9.  
    int m = n % 26;
  10.  
    if (m == 0) m = 26;
  11.  
    s = (char)(m + 64) + s;
  12.  
    n = (n - m) / 26;
  13.  
    }
  14.  
    return s;
  15.  
    }
  16.  
     
  17.  
    /// <summary>
  18.  
    /// 将指定的26进制表示转换为自然数。映射关系:[A-Z] ->[1-26]。
  19.  
    /// </summary>
  20.  
    /// <param name="s">26进制表示(如果无效,则返回0)。</param>
  21.  
    /// <returns>自然数。</returns>
  22.  
    public static int FromNumberSystem26(string s){
  23.  
    if (string.IsNullOrEmpty(s)) return 0;
  24.  
    int n = 0;
  25.  
    for (int i = s.Length - 1, j = 1; i >= 0; i--, j *= 26){
  26.  
    char c = Char.ToUpper(s[i]);
  27.  
    if (c < 'A' || c > 'Z') return 0;
  28.  
    n += ((int)c - 64) * j;
  29.  
    }
  30.  
    return n;
  31.  
    }
  32.  
     
  33.  
    static void Main(string[] args){
  34.  
    int[] numbers = { 1, 10, 26, 27, 256, 702, 703 };
  35.  
    foreach (int n in numbers){
  36.  
    string s = ToNumberSystem26(n);
  37.  
    Console.WriteLine(n + "\t" + s + "\t" + FromNumberSystem26(s));
  38.  
    }
  39.  
    Console.ReadLine();
  40.  
    }

 

运行结果如下图所示:

 

【总结】
一般情况下,各种进制都是以0为起点递增的,例如,八进制(0-7),16进制(0-F)。在本文中,我们设计的26进制是以A为起点的,而不是0,这是主要的不同点。

 

php代码实现:

 

  1.  
    /**
  2.  
    * 将十进制数字转化为26进制用A-Z来表示
  3.  
    * @param type $n
  4.  
    * @return string
  5.  
    */
  6.  
    function AZ26($n) {
  7.  
    $letter = range('A', 'Z', 1);
  8.  
    $s = '';
  9.  
    while ($n > 0) {
  10.  
    $m = $n % 26;
  11.  
    if ($m == 0)
  12.  
    $m = 26;
  13.  
    $s = $letter[$m - 1] . $s;
  14.  
    $n = ($n - $m) / 26;
  15.  
    }
  16.  
    return $s;
  17.  
    }

 

 

 

分享到:
评论

相关推荐

    字母转换为数字(26进制转换为10进制)

    字母转换为数字(26进制转换为10进制)

    二进制和十进制之间的转换

    主要实现二进制和十进制的数字转换的源代码,void CharToHex(char * dest, char * buffer , int len)中实现了字母间的二进制转换

    常用进制转换工具v1.0免费绿色版

    常用进制转换工具是款非常实用的常用进制转换工具,能够轻松的实现十六进制、十进制、八进制和二进制数之间的相互转换,让你转换常数更加轻松便捷。

    ASCII及进制转换器

    子网划分辅助:即IP地址十进制与二进制的相互转换,以及二进制的与、或、取反操作 附加工具: .ASCII表:0-127的ASCII表,以2、8、10、16及HTML分别表示 .简化计算器:四则运算、乘方、开方、阶乘。大部分功能...

    汇编语言实现二进制,十进制,十六进制的相互转换

    8086系统,利用汇编语言实现8位以上进制转换

    Python实现的进制转换器

    Python实现的进制转换器#1、十六进制以内实数任意进制对任意进制的转换 #2、小数位数超过十位保留十位小数 #3、包含负数的转换(是数值的转换而不是补码) #4、能够实现更高进制的转换:直接增加waitNumber中的字母...

    Delphi 将十六进制转换为十进制.rar

    本源码演示Delphi 如何将十六进制转换为十进制,例如将16进制的ABC转换成10进制的2740,请注意,为确保转换的准确性,请输入大写的16进制的英文字母。

    单片机-进制-PPT.pptx

    1、计算机的数制有哪些 2、十进制、二进制、十六进制分别有哪些特点 3、十进制、二进制、十六进制分别可用哪些字母来表示 4、二进制数的位数与其状态有什么关系 5、字节的概念是什么 6、如何将二进制数、十六进制数...

    SQL SERVER 34进制转10进制函数

    一般常见为36进制转10进制,但为了区分26个字母中O和I与阿拉伯数字0和1相似,所以特殊情况会用34进制转10进制( 三十四进制转十进制 )的换算。目的是排除26个字母中O和I,24个字母+10个阿拉伯数字=34。...

    ACSII 及进制转换工具

    子网划分辅助:即IP地址十进制与二进制的相互转换,以及二进制的与、或、取反操作 附加工具: .ASCII表:0-127的ASCII表,以2、8、10、16及HTML分别表示 .简化计算器:四则运算、乘方、开方、阶乘。大部分功能支持...

    将M进制的数X转换为N进制的数输出

    题目描述:将M进制的数X转换为N进制的数输出。 输入描述:输入的第一行包括两个整数:M和N(2,N)。下面的一行输入一个数X,X是M进制的数,现在要求你将M进制的数X转换成N进制的数输出。 输出描述: 输出X的N进制表示的...

    ASCII及进制转换 V4.0

    子网划分辅助:即IP地址十进制与二进制的相互转换,以及二进制的与、或、取反操作 附加工具: .ASCII表:0-127的ASCII表,以2、8、10、16及HTML分别表示 .简化计算器:四则运算、乘方、开方、阶乘。大部分功能支持...

    进制转换工具

    子网划分辅助:即IP地址十进制与二进制的相互转换,以及二进制的与、或、取反操作 附加工具: .ASCII表:0-127的ASCII表,以2、8、10、16及HTML分别表示 .简化计算器:四则运算、乘方、开方、阶乘。大部分功能支持...

    C语言中十六进制转十进制两种实现方法

     从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。  注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。 样例输入 FFFF 样例输出 65535 思路:感觉自己的...

    C#十六进制字符串转十进制int的方法

    主要介绍了C#十六进制字符串转十进制int的方法,涉及C#操作数制转换的技巧,具有一定参考借鉴价值,需要的朋友可以参考下

    按键精灵文件网页数组字符进制转换范例

    包含按键中的正则表达式、时间日期、随机(随机输出数字、字母、汉字,数字字母混合,数字汉字混合,以及你能够想像得出的任意组合方式)。 字符函数(字符串-提取、字符串-输出、字符串-返回、字符串-删除) excel...

    PHP实现十进制数字与二十六进制字母串相互转换操作示例

    主要介绍了PHP实现十进制数字与二十六进制字母串相互转换操作,涉及php字符串遍历、转换相关操作技巧,需要的朋友可以参考下

    汇编实现功能转化程序(字母、数制转换)

    完成一个字母或数制之间的转化程序,主程序分别具有3种可选择的子功能,按相应的字母(X=&gt;功能1; Y=&gt;功能2; Z=&gt;功能3)可分别进入相应...(2)实现十进制数向十六进制数的转换; (3)实现十六进制数向十进制数的转换。

    一款MFC软件将输入的ASCII串转换为十进制或十六进制

    解压后运行Ascii2Hex.exe即可,只支持数字字母(大小写),其他不支持。若需要支持请联系friendsdan_angle@163.com

Global site tag (gtag.js) - Google Analytics