勵志用更少的代碼做更高效的表達
題目描述
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; }
把手舉過頭頂,突然張開五指,那么,恭喜你給自己放了個煙花!
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/173801.html
標籤:其他
上一篇:演算法(01)--動態規劃詳解
