日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

21行代码AC_标题 Excel地址 2017年蓝桥杯真题(解题报告+通法)

發布時間:2024/2/28 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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年蓝桥杯真题(解题报告+通法)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。