十進位和26進位轉換演算法

來源:互聯網
上載者:User

最近在封裝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進位轉換為十進位的過程正好是相反的,而且實現起來也更為簡單,在此不述。

C#原始碼如下:

/// <summary>/// 將指定的自然數轉換為26進位表示。映射關係:[1-26] ->[A-Z]。/// </summary>/// <param name="n">自然數(如果無效,則返回Null 字元串)。</param>/// <returns>26進位表示。</returns>public static string ToNumberSystem26(int n){    string s = string.Empty;    while (n > 0){        int m = n % 26;        if (m == 0) m = 26;        s = (char)(m + 64) + s;        n = (n - m) / 26;    }    return s;} /// <summary>/// 將指定的26進位表示轉換為自然數。映射關係:[A-Z] ->[1-26]。/// </summary>/// <param name="s">26進位表示(如果無效,則返回0)。</param>/// <returns>自然數。</returns>public static int FromNumberSystem26(string s){    if (string.IsNullOrEmpty(s)) return 0;     int n = 0;    for (int i = s.Length - 1, j = 1; i >= 0; i--, j *= 26){        char c = Char.ToUpper(s[i]);        if (c < 'A' || c > 'Z') return 0;        n += ((int)c - 64) * j;    }    return n;}static void Main(string[] args){    int[] numbers = { 1, 10, 26, 27, 256, 702, 703 };    foreach (int n in numbers){        string s = ToNumberSystem26(n);        Console.WriteLine(n + "\t" + s + "\t" + FromNumberSystem26(s));    }    Console.ReadLine();}

 

運行結果如所示:

【總結】
一般情況下,各種進位都是以0為起點遞增的,例如,八進位(0-7),16進位(0-F)。在本文中,我們設計的26進位是以A為起點的,而不是0,這是主要的不同點。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.