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

2022-01-19 03:48:45 字數 1657 閱讀 2028

最近在封裝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,對映規則是->。然後將c拼接到26進製值s的左邊,也就是置s←c + s。

step3.[去餘降冪] 置n←(n–m)/26。如果n > 0,則回到step1繼續執行,否則進入step4。

step4.[結束] 返回s。

按照上述思想,26進製轉換為十進位制的過程正好是相反的,而且實現起來也更為簡單,在此不述。

c#源**如下:

///

///將指定的自然數轉換為26進製表示。對映關係:[1-26] ->[a-z]。

//////

自然數(如果無效,則返回空字串)。

///26進製表示。

public

static

string tonumbersystem26(int

n)

return

s;}

//////

將指定的26進製表示轉換為自然數。對映關係:[a-z] ->[1-26]。

//////

26進製表示(如果無效,則返回0)。

///自然數。

public

static

int fromnumbersystem26(string

s)

returnn;}

static

void main(string

args);

foreach (int n in

numbers)

console.readline();

}

執行結果如下圖所示:

【總結】

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

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

問題描述 在excel中,列的名稱是這樣乙個遞增序列 a b c z aa ab ac az ba bb bc bz ca zz aaa aab 我們需要將上述列名序列和以下自然數序列相互轉換 1 2 3 問題分析 經過分析,我們不難發現,這是乙個26進製和十進位制相互轉換的問題。序列a z依次對應...

十進位制和十六進製制轉換

在c 中,十進位制和十六進製制轉換非常簡單,方法如下 十進位制轉為十六進製制 1 int a 100 2 string stra a.tostring x8 十六進製制轉為十進位制 1 int b int32.parse 266 system.globalization.numberstyles.h...

十進位制和任意進製的轉換

s.push 入棧s.top 取棧頂元素 s.pop 出棧s.empty 棧不為空 1.十進位制轉換成八進位制 二進位制 include include include windows.h using namespace std int main while s.empty system pause...