日期:2025年10月5日
ZeroJudge 題目連結:f291. 試算表大小
解題想法
先將讀到的字串拆成左側字母、右側數字兩個部分,再從字母最後面往回讀取,計算是第幾欄,再將欄數乘以列數就是答案。
Python 程式碼
使用時間約為 18 ms,記憶體約為 3.3 MB,通過測試。
s = input() # 輸入的儲存格編號
left = "" # 左半邊的欄位
row = 0 # 列數
for i, c in enumerate(s): # 依序讀取 s 的字元
if c.isdigit(): # 如果 c 是數字,取出左半邊,中止迴圈
left = s[:i]
row = int(s[i:])
break
b = 1 # 計算欄位的基底
col = 0 # 欄位編號
for c in left[::-1]: # 從 left 最後面讀取字元
col += b*(ord(c) - ord('A') + 1) # 計算欄位
b *= 26 # 基底乘以 26
print(row*col) # 答案是列、欄相乘
C++ 程式碼
使用時間約為 3 ms,記憶體約為 356 kB,通過測試。
#include <iostream>
#include <string>
#include <cctype>
using namespace std;
int main() {
ios::sync_with_stdio(0); cin.tie(0);
string s, left = ""; cin >> s; // 輸入的儲存格編號,左半邊的欄位
int row = 0; // 列數
for(int i=0; i<(int)s.size(); i++) { // 依序讀取 s 的字元
if (isdigit(s[i])) { // 如果 c 是數字,取出左半邊,中止迴圈
left = s.substr(0, i);
row = stoi(s.substr(i));
break;
}
}
int b = 1, col = 0; // 計算欄位的基底,欄位編號
for(auto it = left.crbegin(); it != left.crend(); it++) { // 從 left 最後面讀取字元
col += b*(*it - 'A' + 1); // 計算欄位
b *= 26; // 基底乘以 26
}
cout << row*col << "\n"; // 答案是列、欄相乘
return 0;
}
沒有留言:
張貼留言