Excel地址
問題描述
Excel單元格的地址表示很有趣,它使用字母來表示列號。
比如,
A表示第1列,
B表示第2列,
Z表示第26列,
AA表示第27列,
AB表示第28列,
BA表示第53列,
....
當然Excel的最大列號是有限度的,所以轉換起來不難。
如果我們想把這種表示法一般化,可以把很大的數字轉換為很長的字母序列呢?
本題目即是要求對輸入的數字, 輸出其對應的Excel地址表示方式。
樣例輸入
26
樣例輸出
Z
樣例輸入
2054
樣例輸出
BZZ
資料規模和約定
我們約定,輸入的整數範圍[1,2147483647]
峰值記憶體消耗(含虛擬機器) < 256M
CPU消耗 < 1000ms
思路
看到題目的第一思路: 進位制轉換問題~~~
但是按照進位制轉換思路寫了之後,通過率沒有100%。 不過思路並沒有出錯 ,但是與一般的進位制轉換問題不同的是,我們的進位制轉換沒有 0 位,所以在對 A 和 Z 的處理上稍微注意一下,因為如果我們輸入的數是 26 的倍數的話,因為沒有 0 位,比如 26 的表示為 Z ,但52的表示為 AZ ,但是如果我們對 52 不停 短除26 ,會發現結果為 [2, 0] 。與下圖的字典對照會發現應該為 BZ ,很明顯多了一個 26 。計算機對數的取模運算是會取到0的,我們的開始的26個字母也是有用0來表示的,因此26我們可以想象成 [ ]Z (空格Z)。
所以進位制轉換的思想就是: 逢Z減Z 。即如果這個數可以被26整除,那麼我們減去一個26。
Line"/>
比如對於 AZCZ :
表示為1*26^3 + 26*26^2 + 3*26^1 + 26*26^0
短除過程為:
演算法如下
1 #include<iostream> 2 #include<map> 3 #include<vector> 4 5 using namespace std; 6 7 typedef map<int, char> mp; 8 typedef map<int, char>::value_type init; 9 10 mp INITmp() 11 {// 為了看起來更符合我們的直觀感受,這裡還是用了字典 12mp ch; 13ch.insert(init(0, 'Z')); 14for(int i=0;i<25;i++){ 15ch.insert(init(i+1, i + 'A')); 16} 17return ch; 18 } 19 20 int main() 21 { 22int x=0; 23mp dic = INITmp(); 24while(cin>>x) 25{ 26vector<char> s; 27while(x) 28{ 29s.push_back(dic[x%26]); 30// 這裡是核心程式碼,逢Z減Z,其餘的地方與進位制轉換問題無二! 31if(x%26 == 0) x -= 26; 32x /= 26; 33} 34// 依然是倒序輸出 35for(int i=s.size()-1;i>=0;i--){ 36cout<<s.at(i); 37} 38cout<<endl; 39} 40 41return 0; 42 } View Code