最近在封裝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進製數一樣的說,把...