[R25A]小Z老师的拼数游戏0


数据规模:aa 的位数 nn、bb 的位数 mm 满足 1≤n,m≤1001 \le n, m \le 100,a≥1a \ge 1,b≥0b \ge 0,且 a,ba, b 均不含前导 00。

思路

由于 a,ba, b 的位数可达 100100,远超任何整型范围,直接按字符串处理即可。整体就是一个纯模拟:

  1. 把 bb 的字符序列反转,得到 b′b';
  2. 跳过 b′b' 开头的所有前导 00(但要保留至少一个字符,即 b=0b = 0 时结果仍是 "0");
  3. 把处理后的 b′b' 拼到 aa 的末尾,输出拼接结果。

一个等价但更简洁的观察:跳过前导 00 等价于「找到第一个非 00 的位置开始截取;若全为 00 则取最后一个 00」。这样只需一次线性扫描。

复杂度

时间 O(n+m)O(n + m),空间 O(n+m)O(n + m)。

仓颉实现

查看仓颉实现
import std.env.*

main() {
    let reader = getStdIn()
    let line = reader.readln().getOrThrow().split(" ", removeEmpty: true)
    let a = line[0]
    let b = line[1]

    // 将 b 翻转得到 b',用字节列表处理
    let m = b.size
    var arr = Array<UInt8>(m, { _ => 0 })
    for (i in 0..m) {
        arr[m - 1 - i] = b[i]
    }

    // 去除前导 0(保留至少一个字符)
    var start: Int64 = 0
    while (start < m - 1 && arr[start] == 0x30u8) {
        start += 1
    }

    print(a)
    var j = start
    while (j < m) {
        print(Rune(UInt32(arr[j])))
        j += 1
    }
    println()
}