將10進製數字轉化為26進製用A Z來表示

2021-06-20 05:37:08 字數 1755 閱讀 6287

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

/// /// 將指定的自然數轉換為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)

return n;

}static void main(string args);

foreach (int n in numbers)

console.readline();

}

執行結果如下圖所示:

【總結】

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

php**實現:

/**

* 將十進位制數字轉化為26進製用a-z來表示

* @param type $n

* @return string

*/function az26($n)

return $s;

}

將32進製字串轉化為10進製資料

32的n次方 int n32nmultipy int n else if 1 n else 將32進製字串轉換為10進製數 int nstr32to10 std string parastr int nreturn 0 int nsize parastr.size int ntemp int j n...

10進製小數轉化為任意進製小數

將任意十進位制正小數分別轉換成2,3,4,5,6,7,8,9進製正小數,小數點後保留8位,並輸出。例如 若十進位制小數為0.795,則輸出 十進位制正小數 0.795000 轉換成 2 進製數為 0.11001011 十進位制正小數 0.795000 轉換成 3 進製數為 0.21011011 十進...

16進製制轉化為10進製總結

十六 進製轉換 有16進製制 每一位上可以是從小到大為0 1 2 3 4 5 6 7 8 9 a b c d e f16個大小不同的數,即逢16進1,其中用a,b,c,d,e,f 字母不區分大小寫 這六個字母來分別表示10,11,12,13,14,15 16進製制轉10進製 像10進製數一樣的說,把...