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

2021-08-17 00:02:53 字數 1229 閱讀 1501

【問題描述】

在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...