熱門文章

2025年4月12日 星期六

ZeroJudge 解題筆記:j179. 資料分類 (Classification)

作者:王一哲
日期:2025年4月12日



ZeroJudge 題目連結:j179. 資料分類 (Classification)

解題想法


注意:n 的位數在運算時不一定會遞減。

Python 程式碼


利用 int 將字串轉成整數,刪除前面的 0,再用 str 轉回字串。使用時間約為 19 ms,記憶體約為 3.3 MB,通過測試。
import sys

for n in sys.stdin:
    n = n.strip()
    while len(n) > 1:  # 如果 n 長度大於 1 繼續執行
        if len(n) == 4:  # 4 位數
            le, ri = n[:2], n[2:]  # 左、右半邊
            if int(le) >= 10:  # 轉成 int,如果大於等於 10 才要相乘
                le = str(int(le[0])*int(le[1]))  # 兩位轉成 int 相乘再轉回 str
            if int(ri) >= 10:  # 轉成 int,如果大於等於 10 才要相乘
                ri = str(int(ri[0])*int(ri[1]))  # 兩位轉成 int 相乘再轉回 str
            else: ri = str(int(ri))  # 去掉前面的 0
            n = str(int(le + ri))  # 先將 le + ri 轉成 int 再轉回 str,去掉前面的 0
        elif len(n) == 3:  # 3 位數
            le, ri = n[:2], n[1:]  # 左、右半邊
            le = str(int(le[0])*int(le[1]))  # 兩位轉成 int 相乘再轉回 str
            ri = str(int(ri[0])*int(ri[1]))  # 兩位轉成 int 相乘再轉回 str
            n = str(int(le + ri))  # 先將 le + ri 轉成 int 再轉回 str,去掉前面的 0
        elif len(n) == 2:  # 2 位數
            n = str(int(n[0])*int(n[1]))  # 兩位轉成 int 相乘再轉回 str
    print(n)


C++ 程式碼


使用時間約為 2 ms,記憶體約為 352 kB,通過測試。
#include <iostream>
#include <string>
using namespace std;

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    string n;
    while(cin >> n) {
        while(n.size() > 1) {  // 如果 n 長度大於 1 繼續執行
            if (n.size() == 4) {  // 4 位數
                string le = n.substr(0, 2), ri = n.substr(2);  // 左、右半邊
                if (stoi(le) >= 10) {  // 轉成 int,如果大於等於 10 才要相乘
                    le = to_string((le[0]-'0')*(le[1]-'0'));  // 兩位轉成 int 相乘再轉回 str
                }
                if (stoi(ri) >= 10) {  // 轉成 int,如果大於等於 10 才要相乘
                    ri = to_string((ri[0]-'0')*(ri[1]-'0'));  // 兩位轉成 int 相乘再轉回 str
                } else {
                    ri = ri.substr(1);  // 去掉前面的 0
                }
                n = to_string(stoi(le + ri));  // 先將 le + ri 轉成 int 再轉回 str,去掉前面的 0
            } else if (n.size() == 3) {  // 3 位數
                string le = n.substr(0, 2), ri = n.substr(1);  // 左、右半邊
                le = to_string((le[0]-'0')*(le[1]-'0'));  // 兩位轉成 int 相乘再轉回 str
                ri = to_string((ri[0]-'0')*(ri[1]-'0'));  // 兩位轉成 int 相乘再轉回 str
                n = to_string(stoi(le + ri));  // 先將 le + ri 轉成 int 再轉回 str,去掉前面的 0
            } else if (n.size() == 2) {  // 2 位數
                n = to_string((n[0]-'0')*(n[1]-'0'));  // 兩位轉成 int 相乘再轉回 str
            }
        }
        cout << n << "\n";
    }
    return 0;
}


沒有留言:

張貼留言