21行代码AC_标题 Excel地址 2017年蓝桥杯真题(解题报告+通法)
勵志用更少的代碼做更高效的表達
題目描述
Excel單元格的地址表示很有趣,它使用字母來表示列號。
比如,
A表示第1列,
B表示第2列,
Z表示第26列,
AA表示第27列,
AB表示第28列,
BA表示第53列,
…
當然Excel的最大列號是有限度的,所以轉換起來不難。
如果我們想把這種表示法一般化,可以把很大的數字轉換為很長的字母序列呢?
本題目既是要求對輸入的數字, 輸出其對應的Excel地址表示方式。
例如,
輸入:
26
則程序應該輸出:
Z
再例如,
輸入:
2054
則程序應該輸出:
BZZ
我們約定,輸入的整數范圍[1,2147483647]
解題思路
Excel單元格… 算了。題意很簡單,A-Z代表1-26, 如:BZZ = 2*262 + 26*261 + 26*26o = 2054
這種劃分題無非兩種分法: 從大至小劃分, 或從小至大取余劃分。
受慣性思維影響, 最初的想法是從大至小劃分,因為總覺得劃分了大塊在去劃分小塊要容易些(汗,和我一樣想法的舉個爪)。但在解釋樣例的時候, 我發現如果按照從大至小的思想來做, BZZ會被解釋稱C空Z, 因為第二個Z的26*26 可以看做1*26*26, 即若某個字母為Z,它就可以被前一個字母表示。 遂放棄。
那就只剩從小到大取余劃分了, 由于邏輯比較繞, 因此選擇先在草紙上實現代碼, 最后謄到編譯器上。
總結:本題思路不難, 但由于走岔了路, 還是做了好久才搞出來。
代碼展示
#include<bits/stdc++.h> using namespace std; int main() {//定義一個數組, 存儲1-26 方便映射int a[26];a[0] = 26;for(int i = 1; i < 26; i++) a[i] = i; int n; cin>>n;string s;int num = 0;while(n>0) {int k1 = pow(26, num+1); //將其不能被k1整除的部分整合成字母。int k = n%k1;k /= pow(26, num);int x = a[k];s += (char)(x-1+65);n -= pow(26, num)*a[k];num++; }int len = s.length();for(int i = len-1; i >= 0; i--) cout << s[i]; return 0; }把手舉過頭頂,突然張開五指,那么,恭喜你給自己放了個煙花!
總結
以上是生活随笔為你收集整理的21行代码AC_标题 Excel地址 2017年蓝桥杯真题(解题报告+通法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【已解决】蓝桥杯 2017年C组第五题
- 下一篇: 【解题报告+通法】_九宫幻方 蓝桥杯 2