【問題描述】
在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++**:
#include#include using namespace std;
int main()
reverse(str.begin(),str.end()); //反序
cout/// /// 將指定的自然數轉換為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();
}
十進位制和26進製轉換演算法
最近在封裝excel元件,需要提供兩個介面,分別根據單元索引和單元名稱訪問單元格。例如,getcell 1,2 和getcell a2 這兩種方法返回的結果是相同的。這裡遇到乙個問題,如何在單元索引 1,2 和單元名稱 a2 之間相互轉換?由於在單元索引和單元名稱中,行號是相同的,所以我們只需要轉換...
十進位制和十六進製制轉換
在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...